スクリプト間で変数を渡すには?
例:2つのテストスクリプトがあります。
-- test2.sh
#!/bin/bash
echo "this is test2.sh"
echo "varname is $varname"
echo end
-- tes1.sh
#!/bin/bash
varname="123456"
ssh [email protected]
"bash" < varname=$varname test2.sh
アイデアは、test1.sh
リモートサーバーに接続して実行するために実行することですtest2.sh
。しかし、私が得るものは。varName is 123456: No such file or directory
答え1
なぜパラメータとして渡さないのですか?つまり。
test2.sh
#!/bin/bash
echo "this is test2.sh"
echo "varName is $1"
echo end
test1.sh
#!/bin/bash
varName="123456"
scp test2.sh [email protected]:/tmp/
ssh [email protected] "/tmp/test2.sh $varName"
ssh [email protected] "rm -f /tmp/test2.sh"
答え2
「作業順序」タイプの問題があるようです。<
コマンドを実行する前に処理して同様のものを実行しています(まったく同じではありませんが)。
varname=$varname test2.sh | ssh [email protected] bash
ローカルで実行されtest2.sh
、その出力をbash
リモートサーバーに送信します。そのため、出力が表示されますが、そのtest2.sh
出力をコマンドとして実行しようとするとエラーが発生します。
実行可能なスクリプトを実行している場合は、実際には必要ないので、bash
次のことができます。
ssh [email protected] "varname=$varname ./test2.sh"
test2.sh
リモートサーバーで使用できるとします。
リモートサーバーがなく、test2.sh
まだそこから実行したい場合は、次のことができます。
ssh [email protected] varname="$varname" bash < test2.sh
bash
これによりスクリプトソースがリダイレクトされますが、実行可能ファイルのコンテキストで変数処理が実行されます。
答え3
コマンドラインでプロセス環境を定義するには、定義をソートする必要があります。今後注文する:
varname=$varname bash < $varname test1.sh
実際には、次のようなファイルを開きたいとは思えません。
varname=${expansion_of_varname}
これがあなたがやろうとしているようですが。これにより問題も発生すると予想されます。欲しいならすべて変数の割り当てはすべてのシェルサブ環境に影響を与えるため、次のことができます。
set -a
...最初。(x=; <${x:=file} sh -c 'echo "$x"'
それでも中間セミコロンなしでは動作しないようです。)。