아무 것도 인쇄되지 않지만 왜 그런지 이해가 안 됩니까?
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' ]
$result
literal 을 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
이것을 기억해야 합니다. 그러면 잠시 동안 디버깅의 수고를 덜 수 있습니다.