내가 main.sh에 있다고 가정 해보십시오.
$NAME="a string"
if [ -f $HOME/install.sh ]
. $HOME/install.sh $NAME
fi
그리고 install.sh에서 :
echo $1
이것은 에코 "a string"
하지만 에코는 없습니다. 왜?
답변
Michael Mrozek 은 대부분의 문제를 다루며 Bash를 사용하고 있기 때문에 그의 수정 사항이 작동합니다.
인수가 포함 된 스크립트를 제공하는 기능이 강타라는 사실에 관심이있을 수 있습니다. 에서 sh
또는 dash
당신의 main.sh
전래 스크립트에 인수가 무시되기 때문에 의지하지 아무것도 에코와 $1
의 인수를 참조합니다main.sh.
에서 스크립트를 소싱 할 때 sh
마치 소싱 된 스크립트의 텍스트를 복사하여 소싱 된 파일에 붙여 넣는 것과 같습니다. 다음 사항을 고려하십시오 (참고로 Michael이 권장하는 수정 사항이 있음).
$ bash ./test.sh
A String
$ sh ./test.sh
$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
답변
세 가지 오류가 있습니다.
-
할당 라인이 잘못되었습니다 :
$NAME="a string"
변수를 할당 할 때는
$
; 그것은해야한다:NAME="a string"
-
당신이 누락되었습니다
then
; 조건부 행은 다음과 같아야합니다.if [ -f $HOME/install.sh ]; then
-
$NAME
공백이 있어도 인용하지 않습니다 . 소스 라인은 다음과 같아야합니다.. $HOME/install.sh "$NAME"
답변
스크립트를 소싱하기 전에 매개 변수를 설정하십시오!
main.sh
#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
set -- $NAME ;
. install.sh ;
fi
exit;
install.sh
#!/bin/bash
echo " i am sourced by [ ${0##*/} ]";
echo " with [ $@ ] as parametr(s) ";
exit;
테스트
u@h$ ./main.sh some args
i am sourced by [ main.sh ]
with [ some args ] as parametr(s)
u@h$