Bash 스크립트가 작동하지 않습니다

Bash 스크립트가 작동하지 않습니다

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확장 섹션을 참조하세요 .

이전 확장 이후에는 이전 확장 중 하나에서 발생하지 않은 따옴표가 없는 문자 \, ' 및 "가 모두 제거됩니다.

"매개변수 확장 결과는 다음과 같으므로 제거되지 않습니다.

관련 정보