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


18

main.shにあるとします:

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

およびinstall.shで:

echo $1

これはechoするはずですが"a string"、何もエコーしません。どうして?


2
質問を更新しないでください。この方法では、最初の質問で何が間違っていたのかわかりません。ただロールバックしました。
バレンティンバジラミ14

回答:


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

本当の問題はスクリプトのエラーではなく、主にshをbashと同一視したためです。bashは、この状況でshをエミュレートするのがまずいためです。あなたの答えは、この問題について私を励ましてくれました、ありがとう。
誰かがまだあなたを使用していますMS-DOS

2
技術的には、ここではもっとkshismです(すでにksh86にありますが、おそらくそれ以前)。@ SomebodystillusesyouMS-DOS、「sh」仕様は追加の引数を渡した場合に何が起こるべきかを述べていないため、ダッシュまたはbashの動作はもう「sh」ではなく、同等に有効です。
ステファンシャゼル

16

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

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

    $NAME="a string"

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

    NAME="a string"
  2. あなたが行方不明thenです。条件行は次のようになります。

    if [ -f $HOME/install.sh ]; then
  3. $NAMEスペースが含まれていても、引用していません。ソース行は次のとおりです。

    . $HOME/install.sh "$NAME"

彼には他にもいくつかのエラーがありますが、それが必ずしも彼が提起する問題の原因ではないと思います。
スティーブンD

@Steven確かに、私が言及しなかったものがいくつかありました。現在リストされている修正が適用されます
Michael Mrozek

@Steven私はそれを試すためにスクリプトを一緒に投げていたとき、私はそれを略した[ -f $HOME/install.sh ] && . $HOME/install.sh $NAME。エラーを探しているときは、おそらくそのようなことをすべきではありません
マイケルMrozek

彼が特にBASHに言及しているので、実際に問題はないと思っていた他の問題のように見えます。
スティーブン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$

フラグはどのように設定しますか?
ジョナサンランドラム

編集:あなたは明らかに--彼らがちょうどコマンド引数であったように後にそれらを単に文字列:set -- -v foo -l bar -j "${bin}"
ジョナサンランドラム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.