쉘 스크립트 "if"문에서 변수 인용


9

예 :

if [ "$FOO" = "true" ]; then

vs

if [ $FOO = "true" ]; then

다른 점은 무엇입니까? 두 문장 모두 작동하는 것 같습니다.



@DennisWilliamson () 평등 및 패턴 일치 연산자의 오른쪽에는 따옴표가 필요하지 않습니다.
Gilles 'SO- 악마 그만해'


@Gilles : 때로는 그렇지 않습니다. 공백이 포함 된 리터럴 문자열 또는 문자 그대로 사용하려는 glob 문자가 포함 된 리터럴 문자열 또는 변수의 경우 오른쪽을 인용해야합니다 a='foo bar'; [[ $a == "foo bar" ]]. 그러나 glob 문자를 포함하지 않는 변수는 다음과 같을 필요는 없습니다 [[ $a == $a ]]. 이중 대괄호 안에는 단어 확장이 수행되지 않습니다. 그리고 정규식 일치에, 오른쪽에있는 패턴을 인용해서는 안되거나 리터럴 문자열로 이동합니다 : [[ $a =~ .*oo.*r ]](패턴이 있지만, 대신 ..., 미 인용 변수에 있어야합니다
. 일시 중지 추후 공지가있을 때까지

문자 그대로 여기에 포함됨). glob 스타일 패턴 일치의 경우 리터럴 또는 변수에 상관없이 glob 문자를 인용해서는 안됩니다 [[ $a == foo* ]]. 리터럴 문자열 예제 외에 인용 요구 사항에 대한 추가 예제를 제공 할 수 있습니까?
추후 공지가있을 때까지 일시 중지되었습니다.

답변:


6

의 값이 $FOO와일드 카드 문자를 포함하지 않는 단일 단어 인 \[*?경우 두 단어 는 동일합니다.

경우 $FOO할당되지 않은, 또는 빈, 또는 두 개 이상의 단어 (즉, 공백 또는 포함 $IFS, 다음 인용되지 않은 버전의 구문 오류입니다). 단어의 올바른 순서 (예 0 -eq 0 -o false:) 일 경우 결과는 임의적 일 수 있습니다. 따라서 항상 셸 스크립트에서 변수를 인용하는 것이 좋습니다.

덧붙여, "true"인용 할 필요가 없습니다.


3

어떤 문제가 발생할 수 있는지 설명하기 위해 여기 몇 가지 예가 있습니다.

다음과 같이 두 가지 변수가 있다고 가정 해 봅시다.

FOO="some value"
BAR="some value"

이제 정확히 동일한 문자열 / 값을 보유하는 두 개의 변수가 있습니다. 결과를 테스트하기 위해 if 문을 작성한 경우 다음과 같습니다.

if [ $FOO = "$BAR" ]; then echo "match"; else echo "no match"; fi

이 시점에서 당신은 얻을 것이다 bash: [: too many arguments. 인용되지 않은 $ FOO는 이제 세 개의 값, 즉을 보유합니다 '[ , some , value'. [test 키워드는 첫 번째 또는 두 번째 인수가 연산자 일 것으로 예상되므로 실행할 항목을 모릅니다.

"$ FOO"를 인용하면 if단어 분리가 발생하지 않는 올바른 값을 보도록 명시 적으로 지시합니다.

또 다른 예:

my_file="A random file.txt"
  • 일을 rm $my_file'A'그에게 세 개의 파일을 만든다 '임의' 'file.txt를'을 제거하는 방법을.
  • 이렇게 rm "$my_file"하면 하나의 파일을 만드는 "임의의 file.txt"가 제거됩니다.

이 예제와 혼동하지 않기를 바랍니다.


0

이 특정한 경우에는 차이가 없습니다.

그러나 $FOO공백이나 특수 문자 가 포함 된 경우 문제가 있습니다.

"$FOO"경우, 공간 문제로부터 사용자를 격리시키기 위해 변수를 총계로 사용합니다.

그러나 사용 $FOO하고 특별한 경우가 있으면 if 문에 영향을 미칩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.