場合によっては、小さな例では上記の変数をシミュレートして検証する必要があります。
次の簡単な例を使って解決しました。
(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh
そして他の組み合わせ。また、shebangインタプリタディレクティブを追加してみましたが、#!/bin/sh -x
目的の結果が得られませんでした。
これは簡単にできますか?
答え1
その後、最初の引数がsh -c inline-script
入り$0
(エラーメッセージにも使用されます)、残りは$1
、$2
... に入ります。
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
だからあなたは以下が欲しい:
sh -c 'find "$1"' sh /tmp
(以前は、sh
最初のパラメータが入ってくる実装を見つけることができた$1
ので、次のようにしました。
sh -c 'find "$1"' /tmp /tmp
または:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
両方の動作を説明したが、POSIXが普及し、公に利用可能になったので、これらのシェルは消えた。
現在のシェルのローカル範囲で$1
設定したい場合は、$2
その機能を使用できます。 Bourneのようなシェルから:
my_func() {
find "$1"
}
my_func /tmp
一部のシェルは匿名関数をサポートしています。次のことが起こりますzsh
。
(){find "$1"} /tmp
またはes
:
@{find $1} /tmp
現在の位置パラメータを永久に変更するには、構文はシェルによって異なります。dchirikovはBourneのような皮を覆った。(Byrne、Cohen、bash
POSIX zsh
、、ash
... yash
)。
構文は次のとおりです。
set arg1 arg2 ... argn
しかし、以下が必要です。
set --
リストを消去(またはshift "$#"
)
set -- -foo
$1
またはで-
始まるものに設定してください。特に、任意のデータを扱う場合(たとえば、位置引数リストの末尾に引数を追加する場合)、常に使用することをお勧め+
します。set --
set -- "$@" other-arg
csh
シリーズ(、)csh
のシェルから配列にtcsh
割り当てることができます。argv
set argv=(arg1 arg2)
rc
シリーズのシェル(rc
、、、es
)から配列akanga
へ:*
*=(arg1 arg2)
要素を個別に割り当てることもできます。
2=arg2
位置パラメータは配列にfish
あります。argv
ただ($1
ここではない$@
):
set argv arg1 arg2
ではzsh
、互換性のために配列csh
に割り当てることもできますargv
。
argv=(arg1 arg2)
argv[4]=arg4
次のようにすることもできます。
5=arg5
これは、次のタスクも実行できることを意味します。
argv+=(another-arg)
最後にパラメータを追加し、次の操作を行います。
argv[-1]=()
argv[2]=()
末尾または中間から引数を削除します。これは他のシェルでは簡単にはできません。
答え2
set --
あなたが必要とするものです:
$ set -- aaa bbb ccc
$ echo "$1"
aaa
$ echo "$2"
bbb
$ echo "$3"
ccc
$ echo "$@"
aaa bbb ccc