バッシュマニュアルから
-v varname
シェル変数varnameが設定されている場合(値が割り当てられている場合)真。
bashスクリプトに位置パラメータが1
設定されているかどうかをテストし-v 1
ますが、コマンドラインパラメータを指定するとテストに合格しません。理由を知りたいです。
#! /bin/bash
if [ -v 1 ]; then
echo "1 exists"
fi
ありがとうございます。
答え1
Bash では Bash 5.1 以降で動作しますが、以前のバージョンでは自動的に失敗します。 (zshでも動作します.)
$ ./bash-5.1/bash -c 'set -- aa bb; for i in 1 2 3;
do [ -v $i ] && echo y || echo n; done'
y
y
n
ソースコードのCHANGESファイルには、5.1-alphaのこれらの変更が記載されています。
3. New Features in Bash
...
x. `test -v N' can now test whether or not positional parameter N is set.
それにもかかわらず、2つの間に少し不気味な違いがあります。変わりやすいそしてパラメータ。
Bashリファレンスマニュアルはこれを定義します。このように:
ㅏ範囲値を格納するエンティティです。
name
、数字、または下記の特殊文字のいずれかです。 ㅏ変えるで表されるパラメータですname
。
まだ一つあります。name
次のように定義されます。〜のように
A は
word
文字、数字、下線のみで構成され、文字または下線で始まります。Names
シェル変数と関数名として使用されます。また〜として知られているidentifier
。
したがって、すべての変数はパラメータですが、すべてのパラメータは変数ではありません。そして戻ってくるtest -vvarname
シェル変数がTrueの場合変数名設定しました
したがって、技術的には、実際の変数以外の何も記録しません。これで位置パラメータでも機能しますが、ドキュメントにはまだ次のようなものだけが記載されているようです。変わりやすい。
とにかく、${1+x}
空の文字列と$1
他の文字列を拡張してテストできます。範囲(すべてを含む変わりやすい.) 引数が設定されている場合(設定されているが空の場合でも)、与えられた${par+value}
文字列に展開され、それ以外の場合は空の文字列に展開されます。value
$ bash -c 'set -- aa bb; [ ${1+x} ] && echo y || echo n'
y
これは、すべてのバージョンのBashとすべての標準シェルで動作します。