문자열로 전달된 인용 매개변수

문자열로 전달된 인용 매개변수

으로 확인한 스크립트가 있습니다 shellcheck. 명령의 경우 인수/플래그를 문자열로 전달하고 shellcheck가 이에 대해 불평합니다. 즉, 다음을 수행합니다.

options="-j 5 -B"
make $options file

대신에 그들은[1] 이것이 더 나은 이유를 명시적으로 언급하지 않고 다음을 수행할 것을 제안합니다.

options=(-j 5 -B) # ksh: set -A options -- -j 5 -B
make "${options[@]}" file

후자의 예가 이전 예보다 나은 이유는 무엇입니까?

[1]https://github.com/koalaman/shellcheck/wiki/SC2086

답변1

간단한 경우에는 이것이 중요하지 않습니다.

일부 옵션에 인용이 필요한 경우 다음을 고려하세요.

options=(-j 5 "Hello, World" -B)
make "${options[@]}" file

4개의 요소는 배열 초기화에서 올바르게 참조되며 배열 대체는 해당 요소를 올바르게 다른 단어로 만듭니다.

한 단계 대체는 부분 따옴표(문자열 주위에 작은 따옴표가 있는 경우에도)로 수정할 수 없습니다. 선택지는 1개이거나 5개입니다. 결코 4개 선택이 아닙니다.

paul $ options="-j 5 'Hello, World' -B"
paul $ declare -p options
declare -- options="-j 5 'Hello, World' -B"
paul $ printf '%s\n' $options
-j
5
'Hello,
World'
-B
$ printf '%s\n' "$options"
-j 5 'Hello, World' -B
$ 

비교:

paul $ options=(-j 5 "Hello, World" -B)
paul $ declare -p options
declare -a options='([0]="-j" [1]="5" [2]="Hello, World" [3]="-B")'
paul $ printf '%s\n' "${options[@]}"
-j
5
Hello, World
-B
paul $ 

관련 정보