後の最初の引数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
は、ここで関数を使用します。ボーンのようなシェルでは:
my_func() {
find "$1"
}
my_func /tmp
一部のシェルは無名関数をサポートしています。それはの場合ですzsh
:
(){find "$1"} /tmp
またはes
:
@{find $1} /tmp
現在の位置パラメータを永続的に変更するには、構文はシェルに依存します。dchirikovはすでにボーンのようなシェルカバーしている(Bourneシェル、Kornシェル、bash
、zsh
、POSIX、 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]=()
他のシェルでは簡単に実行できない引数を末尾または中間から削除します。
(find $1) /tmp
構文エラーです。実際に(any-command) more-arguments
は構文エラーです。あなたがやろうとしていることを別の方法で説明できますか?