LPAR 이름을 수집하여 AIX의 변수에 할당한 다음 여러 명령을 사용하여 처리합니다.
시스템의 LPAR 이름은 ABCD56777 TSM Mobile CD CPT 2입니다.
for lparname in `lssyscfg -r lpar -m $system -F name,lpar_env |cut -f 1 -d, | sort`;
그러나 위의 for 루프 변수는 공백 이후의 완전한 LPAR 값을 얻지 못합니다. (정확한 LPAR 이름은 다음과 같습니다: ABCD56777 TSM Mobile CD CPT 2)
LPAR 단독의 값을 ABCD56777로 지정합니다.
변수에 공백을 할당하는 방법을 알려주실 수 있나요? 불행히도 awk는 설치되지 않았으며 sed만 작동합니다.
답변1
문제는 명령 대체가 공백으로 구분된 문자열로 확장되고 루프가 모든 문자열을 반복한다는 것입니다.성격그 문자열에. "단어"는 공백, 탭 또는 줄 바꿈으로 구분된 모든 항목입니다.
또한 Bourne과 같은 쉘에서는 zsh
다른 {
것이 문제라는 점에 유의하십시오.
lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort |
while IFS= read -r lpar; do
echo "$lpar"
done
이는 while
정적 루프 대신 루프를 사용합니다 for
. 루프 while
본문은 서브쉘(in)에서 실행되므로 루프 본문이 끝난 후에는 변수가 존재하지 않습니다 bash
. lpar
루프 본문 내에서만 변수를 사용하는 경우에는 문제가 되지 않습니다.
또 다른 해결책은 IFS
루프 앞에 개행 문자를 설정하는 것입니다(그리고 루프 후에 재설정합니다).
oldIFS=$IFS
IFS=$'\n' # assumes bash
set -o noglob
for lpar in $( lssyscfg -r lpar -m "$system" -F name,lpar_env | cut -d, -f 1 | sort )
do
echo "$lpar"
done
set +o noglob
IFS=$oldIFS
기본값에는 $IFS
공백이 포함되어 있으므로 원래 루프가 잘못된 내용을 반복합니다. 또한 위에서 설명한 대로 반환된 텍스트에 파일 이름 와일드카드 패턴이 포함된 경우 lssyscfg
예기치 않은 결과가 발생할 수 있으므로 루프에 대한 파일 이름 와일드카드 사용을 해제했습니다.
IMHO, 마지막 변형은 매우 우아하지 않으며 몇 줄 이상의 출력을 생성하는 명령에는 완전히 부적합합니다.
답변2
나는 노력할 것이다
for lpar in $(lssyscfg -r lpar -m $system -F name,lpar_env |awk -F, '{printf "\"%s\"",$1}' | sort)
do
echo "$lpar"
done
$( )
명령 대체로 사용됨{printf "\"%s\"",$1}
주장을 인용할 것이다