소싱 할 때 변수를 bash 스크립트에 전달 ] . $HOME/install.sh $NAME fi 그리고

내가 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

답변

세 가지 오류가 있습니다.

  1. 할당 라인이 잘못되었습니다 :

    $NAME="a string"

    변수를 할당 할 때는 $; 그것은해야한다:

    NAME="a string"
  2. 당신이 누락되었습니다 then; 조건부 행은 다음과 같아야합니다.

    if [ -f $HOME/install.sh ]; then
  3. $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$