web-dev-qa-db-ja.com

ソーシング時に変数をbashスクリプトに渡す

私が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でスクリプトを入手すると、入手したスクリプトのテキストを、それを入手したファイルにコピーして貼り付けたようになります。次の点を考慮してください(マイケルが推奨する修正を加えました)。

$ bash ./test.sh
A String
$ sh ./test.sh

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD
20
Steven D

3つのエラーが表示されます。

  1. 割り当て行が間違っています:

    $NAME="a string"
    

    変数に割り当てる場合、$;は含めません。そのはず:

    NAME="a string"
    
  2. thenがありません。条件付きの行は次のようになります。

    if [ -f $HOME/install.sh ]; then
    
  3. スペースがあっても$NAMEを引用していません。ソース行は次のようになります。

    . $HOME/install.sh "$NAME"
    
16
Michael Mrozek

スクリプトを読み込む前に、パラメーターを設定するだけです。

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$
5
Jonah