나는 $ foo 대신 "$ foo"와 같이 bash에서 변수를 인용해야한다는 것을 읽었습니다. 그러나 스크립트를 작성하는 동안 따옴표없이 작동하지만 따옴표로는 작동하지 않는 경우를 발견했습니다.
wget_options='--mirror --no-host-directories'
local_root="$1" # ./testdir recieved from command line
remote_root="$2" # ftp://XXX recieved from command line
relative_path="$3" # /XXX received from command line
이것은 작동합니다 :
wget $wget_options --directory_prefix="$local_root" "$remote_root$relative_path"
이것은하지 않습니다 (큰 따옴표 aroung $ wget_options 참고).
wget "$wget_options" --directory_prefix="$local_root" "$remote_root$relative_path"
그 이유는 무엇입니까?
첫 번째 줄이 좋은 버전입니까? 아니면이 동작을 일으키는 어딘가에 숨겨진 오류가 있다고 생각해야합니까?
일반적으로 bash와 따옴표가 어떻게 작동하는지 이해하기위한 좋은 문서는 어디에서 찾을 수 있습니까? 이 스크립트를 작성하는 동안 규칙을 이해하는 대신 시행 착오를 거듭하기 시작했습니다.
wget
무엇을 --mirror --no-host-directories
의미 하는지 알지 못하지만 두 개의 인수 로 나눌 때 처리합니다 . 공백과 따옴표가 인수 벡터 내부에 있으면 특수하게 처리하는 프로그램은 거의 없습니다 . 문제는 bash
다른 쉘은>
bash
이므로 $a
내용을 직접 작성하는 것과 정확히 동일합니다. 이제 문제는 분명합니다.으로 a="-a -b"; cmd "$a"
확장 cmd "-a -b"
되지만 cmd
그 의미를 모를 것입니다. cmd $a
로 확장되며 cmd -a -b
아마도 작동 합니다.