Linuxのシェルスクリプトについて質問があります。私はこれを実行しようとしています:
$ sh << EOF
#!/bin/sh
function test {
echo test
echo test2
}
test
EOF
結果:
test
test2
しかし、ファイルに保存せずにパラメータを使用してスクリプトを実行するにはどうすればよいですか?
$ sh $1 test1 test2 << EOF
#!/bin/sh
function test {
echo $2
echo $3
}
test
EOF
どうすればいいですか?
ベストアンサー1
シェルのオプションを使用してシェルを起動すると、シェルは標準入力からスクリプトを読み取り実行します-s
。これにより、最初のオプションがスクリプトファイルの名前であると信じられなくなります。
したがってbash -s "$1" test1 test2
。
スクリプト(またはスクリプト内で呼び出されるユーティリティ)が標準入力ストリームから読み取られると、スクリプト自体を消費します。したがって、標準入力ストリームが必要なスクリプトには適していません。また、非標準キーワードを使用して関数を作成するためにも必要bash
です。sh
function
関数(組み込みコマンド名mytest
への名前変更)が呼び出し時に関数に渡されるスクリプトの2番目と3番目のコマンドライン引数を出力する必要があるとします。test
合格すると、これを行うことができます。みんな関数パラメータの使い方
mytest "$@"
...または必要な2つを渡すこともできます。"$1"
代わりに、関数を"$2"
出力に変更することもできます。それ2つの最初のパラメータ):
mytest "$2" "$3"
$1
また、コマンドラインと$2
スクリプト自体$3
内のすべての拡張を参照する必要があります。バラよりいつ二重引用符が必要ですか?
このスクリプトには以下を使用する必要があります。先頭bash
ここでのドキュメントやスクリプトの拡張は、起動中のシェルではなく呼び出しシェルによって実行されます。ここでは、最初の文書の一部を区切り文字として引用して、ここで文書を参照できます。
これらすべての要素を考えて、次のことを使用できます。
bash -s "$1" test1 test2 <<'END_SCRIPT'
function mytest {
echo "$2"
echo "$3"
}
mytest "$@"
END_SCRIPT
または以下を使用してsh
:
sh -s "$1" test1 test2 <<'END_SCRIPT'
mytest () {
echo "$2"
echo "$3"
}
mytest "$@"
END_SCRIPT