シェルパラメータ変数($ 1、…、$ @)をCLIで直接使用することは可能ですか?


9

場合によっては、上記の変数を小さな例でエミュレートして検証する必要があり、すぐにスクリプトなどにコピーできます。

次の方法で簡単な例を使用して解決しようとしました:

(find $1) /tmp
sh -c '(find $1) /tmp'
sh -c "find $1" /tmp
echo '(find $1) /tmp' | sh

そして他の組み合わせで。また、シバンインタープリターディレクティブを追加して実験しました#!/bin/sh -xが、望ましい結果が得られませんでした。

これは簡単にできますか?


1
(find $1) /tmp構文エラーです。実際に(any-command) more-argumentsは構文エラーです。あなたがやろうとしていることを別の方法で説明できますか?
Celada 14

2
@Celadaは、それがシェルの中に構文エラーはありませんrc(家族rcesakangaと同等だという場合には、...) find $1 /tmp
ステファンChazelas

回答:


15

後の最初の引数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シェル、bashzsh、POSIX、 ashyash...)を。

構文は次のとおりです。

set arg1 arg2 ... argn

ただし、次のものが必要です。

set --

そのリストを空にする(またはshift "$#")および

set -- -foo

またはで$1始まるものに設定するため、特に位置パラメータリストの最後に引数を追加するなど、任意のデータを使用する場合は常に使用することをお勧めします。-+set --set -- "$@" other-arg

cshファミリーのシェル(cshtcsh)では、argv配列に割り当てます。

set argv=(arg1 arg2)

殻でrc家族(rcesakanga)、の*配列:

*=(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]=()

他のシェルでは簡単に実行できない引数を末尾または中間から削除します。


7
set --

あなたが必要なものです:

$ set -- aaa bbb ccc
$ echo "$1"
aaa
$ echo "$2"
bbb
$ echo "$3"
ccc
$ echo "$@"
aaa bbb ccc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.