소싱 할 때 변수를 bash 스크립트에 전달


18

내가 main.sh에 있다고 가정 해보십시오.

$NAME="a string"
if [ -f $HOME/install.sh ]
    . $HOME/install.sh $NAME
fi

그리고 install.sh에서 :

echo $1

이것은 에코 "a string"하지만 에코는 없습니다. 왜?


2
질문을 업데이트하지 마십시오. 이렇게하면 초기 질문에 무엇이 잘못되었는지 알 수 없습니다. 방금 롤백했습니다.
Valentin Bajrami

답변:


20

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

"sh 또는 dash에서 소스 스크립트에 대한 인수는 무시되고 $ 1은 main.sh에 대한 인수를 참조하므로 main.sh는 아무 것도 에코하지 않습니다."정확히 무슨 일이 일어나고 있습니다. 대답 해줘서 고마워.
누군가 아직도 당신을 사용합니다 MS-DOS

실제 문제는 스크립트의 오류가 아니기 때문에 주로 bash와 같았 기 때문에 bash는 허용 된 것으로 표시했습니다 .bash는이 상황에서 sh를 모방하는 데 나쁜 역할을합니다. 귀하의 답변으로이 문제에 대해 감사의 말씀을 전했습니다.
누군가 아직도 당신을 사용합니다 MS-DOS

2
엄밀히 말하면, 여기에는 kshism이 더 있습니다 (이미 ksh86에는 이미 있음). MS-DOS를 사용하는 @Somebody는 "sh"사양은 추가 인수를 전달하면 어떤 일이 발생해야하는지 말하지 않으므로 대시 또는 bash 동작은 다른 것보다 "sh"가 아니며 동일하게 유효합니다.
Stéphane Chazelas

16

세 가지 오류가 있습니다.

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

    $NAME="a string"

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

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

    if [ -f $HOME/install.sh ]; then
  3. $NAME공백이 있어도 인용하지 않습니다 . 소스 라인은 다음과 같아야합니다.

    . $HOME/install.sh "$NAME"

그는 또한 몇 가지 다른 오류가 있지만 이것이 그가 제기 한 문제의 원인이라고 생각하지는 않습니다.
Steven D

@Steven 당신 말이 맞아요, 제가 언급하지 않은 몇 가지가 더 있습니다. 그것은 내가 지금 나열한 픽스와 함께 나를 위해 작동
마이클 Mrozek

@Steven 스크립트를 작성하려고 할 때 다음과 같이 줄여서 사용했습니다 [ -f $HOME/install.sh ] && . $HOME/install.sh $NAME. 내가 오류를 찾을 때 아마 그런 일을해서는 안됩니다
마이클 Mrozek

그가 BASH를 구체적으로 언급했기 때문에 실제로 문제가 없다고 생각한 다른 문제처럼 보입니다.
Steven D

5

스크립트를 소싱하기 전에 매개 변수를 설정하십시오!

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$

플래그를 어떻게 설정합니까?
Jonathan Landrum

편집 : 당신은 분명히 --명령 인수처럼 다음과 같이 문자열로 set -- -v foo -l bar -j "${bin}"
묶습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.