for i in $(xrandr); do echo "$i" ; done
for i in "$(xrandr)"; do echo "$i"; done
for i in "$(xrandr)"; do echo $i; done
1이 2와 다른 이유를 이해합니다. 그런데 왜 3이 2와 다른 출력을 제공합니까? 출력에 대해서도 설명해주세요. 개행 주위의 따옴표는 어떻게 작동합니까?
답변1
따옴표가 없는 변수(예: $var
) 또는 명령 대체(예: $(cmd)
또는 `cmd`
)는 다음과 같습니다.분할+전역Bourne 쉘과 유사한 연산자입니다.
즉, 해당 내용은 $IFS
특수 변수(기본적으로 공백, 탭 및 줄 바꿈 포함)의 현재 값을 기준으로 분할됩니다.
그런 다음 분할에 의해 생성된 각 단어는파일 이름 생성(또한 ~으로 알려진와일드카드또는파일 이름 확장자), 즉 패턴으로 처리되어 해당 패턴과 일치하는 파일 목록으로 확장됩니다.
따라서 for i in $(xrandr)
에서는 $(xrandr)
따옴표 안에 있지 않기 때문에 일련의 공백, 탭 및 줄 바꿈으로 분할됩니다. 그리고 해당 분할로 생성된 각 단어가 파일 이름과 일치하는지 확인하고(또는 파일과 일치하지 않는 경우 그대로 두십시오) for
반복합니다.
에서는 for i in "$(xrandr)"
분할+글로브 연산자를 사용하지 않습니다.명령 대체참조되므로 루프에서 한 번하나xrandr
값: (후행 개행 없이 출력명령 대체줄자).
그러나 다시 echo $i
에서 참조되지 않으므로 $i
컨텐츠가 $i
다시 분할되어 다음을 따릅니다.파일 이름 생성이는 별도의 인수로 명령에 전달됩니다 echo
( echo
공백으로 구분된 인수는 출력됩니다).
그래서 얻은 교훈은 다음과 같습니다.
- 당신이 원하지 않는다면분사또는파일 이름 생성, 항상 변수 확장 및 명령 대체를 참조합니다.
- 당신이 정말로 원한다면분사또는파일 이름 생성, 따옴표 없이 그대로 두되
$IFS
적절하게 설정하거나 필요한 경우 파일 이름 생성을 활성화 또는 비활성화합니다(set -f
,set +f
).
일반적으로 위의 예에서 출력에서 공백으로 구분된 단어 목록을 반복하려면 xrandr
다음이 필요합니다.
$IFS
공백으로 분할하려면 기본값(또는 설정하지 않음)을 그대로 둡니다.- 또는 또는 문자가 출력되지 않을 것이라고
set -f
확신하지 않는 한 파일 이름 생성을 비활성화 하는 데 사용됩니다 (이것은 파일 이름 생성 모드에서 사용되는 와일드카드입니다).xrandr
*
?
[
in
그런 다음 루프 부분에서 분할+glob 연산자를 사용하십시오(따옴표 없이 명령 대체 또는 변수 확장만 남겨두기) for
.
set -f; unset -v IFS
for i in $(xrandr); do whatever with "$i"; done
반복하려는 경우 (비어 있지 않음)철사출력 하려면 개행 문자로 xrandr
설정해야 합니다 $IFS
.
IFS='
'
답변2
인용된 개행 문자는 개행 문자입니다. 따라서 echo "$1"
개행 문자를 직접 에코하고 인쇄하는 명령줄 인수를 제공하십시오.
따옴표가 없는 개행 문자는 공백입니다. 따라서 echo $1
echo에 여러 명령줄 인수를 제공하면 공백으로 구분하여 하나씩 인쇄합니다.