CLIでシェルパラメータ変数($ 1、...、$ @)を直接使用できますか?

CLIでシェルパラメータ変数($ 1、...、$ @)を直接使用できますか?

場合によっては、小さな例では上記の変数をシミュレートして検証する必要があります。

次の簡単な例を使って解決しました。

(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、bashPOSIX 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

関連情報