공백을 사용한 For 루프 변수 할당

공백을 사용한 For 루프 변수 할당

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=read-r-line" 이해

또 다른 해결책은 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}주장을 인용할 것이다

관련 정보