test -vは位置パラメータで機能しますか?

test -vは位置パラメータで機能しますか?

バッシュマニュアルから

-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とすべての標準シェルで動作します。

おすすめ記事