web-dev-qa-db-ja.com

シェルから変数を設定する:スクリプトでそれらを使用する方法?

スクリプトで使用する変数もどのように設定できますか?グローバル/システム全体である必要はありません。現在のセッションで十分です。しかし、何らかの理由で、現在のターミナルから直接スクリプトを実行しても、それらはなくなったように見えます。

例:

foo=bar
echo "$foo"

出力:bar

ただし、test.shにecho "$foo"が含まれている場合、次のようにします。

foo=bar
./test.sh

出力は空です。同じセッションからスクリプトを実行するときに有効のままであるターミナルセッションで一時変数のスコープを設定するにはどうすればよいですか?

5
RocketNuts

export foo=barは、グローバル変数$ fooをbarに設定します。 foo=bar ./test.shを単一のコマンドとして使用して、fooをtest.shのbarに設定することもできます。

7
Kenny

Shellスクリプトを実行すると、新しいShellインスタンスで実行され、インタラクティブなShellインスタンスでインスタンス化された変数を継承しません。

この方法で、環境変数と呼ばれる特定の変数を継承できます。 export foo=barなどのexportを使用して、変数の割り当てを環境変数にします。これはbash構文です。他のシェルはenvまたは他の方法を使用する場合があります。

また、「ソーシング」することで、シェルスクリプトを同じシェルインスタンスで実行させることもできます。これは、. test.sh(ピリオドに注意)またはsource test.shを使用して行うことができます。これはインタラクティブセッションで行うことも、シェルスクリプト内から行うこともできます。これは、シェルの「ライブラリ」を作成するのに非常に便利です。この場合、外部ファイルから一連のシェル関数または変数定義を入手します。超便利です。

例えば:

#!/bin/bash
. /path/lib.sh
echo $foo # foo is instantiated in lib.sh
do_something # this is a Shell function from lib.sh

ここで、lib.shは次のとおりです。

foo="bar"
do_something() {
echo "I am do_something"
}
6
GROND

別のオプションは、変数をスクリプトに引数として渡すことです。

foo=bar
./test.sh $foo

その後、問題は./test.shの内容になります

echo $1 の代わりに echo $foo-スクリプトに渡される最初の引数を示す$ 1。

2
reas0n

同じシェルで割り当てとエコーテストスクリプトを実行できます。

root@ijaz-HP-EliteBook-8560p:~# export foo=bar
root@ijaz-HP-EliteBook-8560p:~# cat test.sh 
   #!/bin/bash
   echo "$foo"
root@ijaz-HP-EliteBook-8560p:~# ./test.sh 
bar

これは、その方法の1つにすぎません。

0
Ijaz Ahmad Khan