私が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
3つのエラーが表示されます。
割り当て行が間違っています:
$NAME="a string"
変数に割り当てる場合、$
;は含めません。そのはず:
NAME="a string"
then
がありません。条件付きの行は次のようになります。
if [ -f $HOME/install.sh ]; then
スペースがあっても$NAME
を引用していません。ソース行は次のようになります。
. $HOME/install.sh "$NAME"
スクリプトを読み込む前に、パラメーターを設定するだけです。
#!/bin/bash
NAME=${*:-"a string"}
if [[ -f install.sh ]];
then
set -- $NAME ;
. install.sh ;
fi
exit;
#!/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$