ls
제공된 인수를 사용하여 명령을 실행하는 스크립트를 만들고 싶습니다 . 왜 작동하지 않나요? 예제를 사용하여 실행해 보았 -R
더니 에코가 발생했습니다(비교를 위해 동일한 내용을 에코했습니다).
ls "-R"
하지만 '-R'에 액세스할 수 없다고 합니다. 해당 파일이나 디렉터리가 없습니다. 하지만 ls "-R"
터미널에서 실행하면 작동합니다.
스크립트 자체:
text='ls'
while [[ $# -gt 0 ]]
do
text+=' "'
text+=$1
text+='"'
shift
done
echo 'ls "-R"'
echo $text
$text
답변1
잘못된 인용이 문제입니다. "
변수에 포함되어 있으면 인용되지 않습니다(여기서 문제는 삭제되지 않습니다!). 예외:eval $text
매개변수를 배열에 할당하고 대신 ls "${vars[@]}"
or를 사용해야 합니다 ls "$@"
.
두 가지 호출을 비교하십시오.
set -x
ls -l
ls "-l"
set +x
답변2
이것은 bash에서 인용이 작동하는 방식이 아닙니다. 입력할 때
ls "-R"
따옴표 제거는 명령에서 발생하므로 명령은 다음과 같습니다.
ls -R
반면에 설정하면
text='ls "-R"'
실행하면 $text
견적 제거가 발생하지 않습니다. man bash
확장 섹션을 참조하세요 .
이전 확장 이후에는 이전 확장 중 하나에서 발생하지 않은 따옴표가 없는 문자 \, ' 및 "가 모두 제거됩니다.
"
매개변수 확장 결과는 다음과 같으므로 제거되지 않습니다.