変数をインポートするときにbashスクリプトに変数を渡す

変数をインポートするときにbashスクリプトに変数を渡す

main.shに次のものがあるとします。

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

そしてinstall.shから:

echo $1

これはechoになっていますが、"a string"何もエコーしません。なぜ?

答え1

マイケル・モロジェほとんどの問題に対処しており、Bashを使用しているので、彼の修正はうまくいくでしょう。

パラメータを使用してスクリプトを取得する機能が恥ずかしいことに興味があるかもしれません。または、shソーススクリプトのパラメータが無視され、パラメータが引用されるため、何もエコーされません。dashmain.sh$1main.sh.

からスクリプトをインポートすると、shソーススクリプトのテキストをソーススクリプトファイルにコピーして貼り付けたのと同じです。次の点を考慮してください(Michaelが提案した修正を適用しました)。

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

$ sh ./test.sh "HELLO WORLD"
HELLO WORLD

答え2

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

  1. 割り当て行が正しくありません。

    $NAME="a string"
    

    変数に割り当てるときは、以下を含めないでください$

    NAME="a string"
    
  2. 何か抜けましたthen。条件付き行は次のようになります。

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

    . $HOME/install.sh "$NAME"
    

答え3

スクリプトを受け取る前にパラメータを設定するだけです!

メインディレクトリ

#!/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$

関連情報