쉘 스크립트에서 출력을 얻으려면 if 및 for를 사용하지 마십시오.

쉘 스크립트에서 출력을 얻으려면 if 및 for를 사용하지 마십시오.

아무 것도 인쇄되지 않지만 왜 그런지 이해가 안 됩니까?

read -e -i "no" -p "Install? " result

if [ '$result' == 'yes' ]; then
  declare -a subs=('one' 'two')
  for sub in "${subs[@]}"
  do
    echo "$sub"
  done
fi

답변1

$result작은따옴표 대신 큰따옴표를 사용해야 합니다 . 그렇지 않으면 확장되지 않습니다.

[ '$result' == 'yes' ]$resultliteral 을 literal 과 비교 하려고 시도하기 때문에 결코 true로 평가되지 않습니다 yes.

또한 Kusarananda가 지적했듯이 연산자는 ==bash 테스트 구성에 사용되는 [[반면 =연산자는 표준(POSIX) 테스트 구성에 사용됩니다 [.

따라서 해당 줄을 다음과 같이 변경해야 합니다.[ "$result" = 'yes' ]


알아야 할 또 다른 좋은 도구는 스크립트를 추적하는 데 사용할 수 있는 set내장 명령과 해당 스위치입니다. 이것을 원래 스크립트의 맨 위에 -x추가 하고 실행하면 다음이 인쇄되는 것을 볼 수 있습니다.set -x

+ read -e -i no -p 'Install? ' result
Install? yes
+ '[' '$result' == yes ']'

보시다시피 "$result"를 "yes"와 비교하려고 합니다. 올바르게 인용하면 변수가 표시되지 않고 $result다음과 같이 확장이 표시됩니다.

+ read -e -i no -p 'Install? ' result
Install? yes
+ '[' yes == yes ']'
+ subs=('one' 'two')
+ declare -a subs
+ for sub in '"${subs[@]}"'
+ echo one
one
+ for sub in '"${subs[@]}"'
+ echo two
two

스크립트를 사용하여 벽에 머리를 세게 부딪칠 때마다 스크립트를 열고 스크립트 set -x가 수행하는 작업과 잘못된 위치를 추적해야 합니다.

답변2

@Jesse_b의 답변을 따릅니다.

변수에 큰따옴표가 필요한 이유는 무엇입니까?

작은따옴표와 큰따옴표의 차이점은 다음과 같습니다.

문자를 작은따옴표로 묶으면 따옴표 안의 각 문자의 리터럴 값이 유지됩니다. 앞에 백슬래시가 있더라도 작은따옴표 사이에는 작은따옴표를 사용할 수 없습니다.

문자를 큰따옴표로 묶으면 기록 확장이 활성화된 경우 $, `, \ 및 !를 제외한 따옴표 안의 모든 문자의 리터럴 값이 유지됩니다.

~에서man bash

이것을 기억해야 합니다. 그러면 잠시 동안 디버깅의 수고를 덜 수 있습니다.

관련 정보