명령 대체를 사용하여 스크립트를 가져올 때 잘못된 매개변수가 전달되었습니다.

명령 대체를 사용하여 스크립트를 가져올 때 잘못된 매개변수가 전달되었습니다.

print.sh 스크립트가 있습니다.

#!/bin/bash
echo printing provided args:

for i in "$@"; do
        echo -e "\t${i}"
done

메시지가 표시될 때 이 작업을 수행하면 저장소의 출력을 a=$(. print.sh ); echo "${a}" 얻습니다.printing provided args:

명령 대체 테스트를 위한 기본 스크립트는 다음과 같습니다.

#!/bin/bash
function func_to_call_sub_scrp
        {
        # Call  sub-script
        capture="$(. $1  $2 $3)"
        echo -e "captured output:
\t\t${capture}"
        }

echo "Run function to call sub script without parameters passed. "
func_to_call_sub_scrp   print.sh
echo ""
echo "Run function to call sub script with parameters passed."
func_to_call_sub_scrp   print.sh     xx  yy

이 출력은 다음과 같습니다.

Run function to call sub script without parameters passed. 
captured output:
                printing provided args:
        print.sh

Run function to call sub script with parameters passed.
captured output:
                printing provided args:
        xx
        yy

두 번째 호출은 예상대로 xx 및 yy를 print.sh로 보냅니다. 그런데 "print.sh" """" 명령 대체를 보내면 "" 및 ""를 보내는 대신 print.sh가 호출되어 $1로 전송됩니다.

제 질문은 다른 입력이 없을 때 $1을 인쇄 스크립트에 매개 변수로 어떻게 전달합니까?입니다. 나는 다시 돌아올 "$(. $1 $2 $3)"것으로 기대합니다 ."$(. print.sh )""printing provided args:"

답변1

하신다는 점 참고해주세요아니요. "print.sh" "" ""첫 번째 예를 실행합니다. 참조 또는 . print.sh가 없기 때문에 실행 중입니다 .$2$3

bash매뉴얼 에서 source(및 .)에 관해 다음을 강조합니다.

[...] 인수가 제공되면 filename을 실행할 때 위치 인수가 됩니다. 그렇지 않으면 위치 매개변수는 변경되지 않고 그대로 유지됩니다.

를 호출할 때 . print.sh도트 스크립트에 인수를 제공하지 않으므로 print.sh위치 인수는 변경되지 않고 유지됩니다. 그런데 그것들은 무엇입니까?

도트 스크립트의 위치 인수는 첫 번째 호출에서 단일 문자열 목록인 함수에 대한 위치 인수가 됩니다 print.sh. 이것이 도트 스크립트 내부에서 "$@"확장이 이루어지는 이유입니다.print.sh


그냥 코멘트:

탭 들여쓰기를 사용하여 모든 위치 인수를 출력하는 더 좋은 방법:

printf '\t%s\n' "$@"

이렇게 하면 echo설명된 문제를 피할 수 있습니다.다른 곳에서. 함수에서 출력이 수행되는 방식에 대해서도 $capture비슷한 설명을 할 수 있습니다 .

$1또한 쉘이 문자별로 분할 하고 결과 단어에 파일 이름 글로빙을 적용하도록 원하지 않는 한 $2따옴표, 및 에 대한 확장 도 필요합니다 . 바라보다$3$IFS언제 큰따옴표가 필요합니까?.

관련 정보