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
언제 큰따옴표가 필요합니까?.