ファイルに保存せずにコンソールセッションでシェルスクリプトを実行する

ファイルに保存せずにコンソールセッションでシェルスクリプトを実行する

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です。shfunction

関数(組み込みコマンド名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

おすすめ記事