私は間接拡張を使用してきましたが、変数が設定されていない場合、結果は空の文字列になります。
$ $SHELL --version | head -1
GNU bash, version 4.4.23(1)-release (x86_64-unknown-linux-gnu)
$ unset var
$ echo "${!var}"
$
ただし、新しいLinuxボックスでは失敗しますinvalid indirect expansion
。
$ $SHELL --version | head -1
GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu)
$ unset var
$ echo "${!var}"
-bash: var: invalid indirect expansion
$
明らかに、両方の場所で動作するようにコードを変更できますが、これまでは1つは失敗し、もう1つは失敗する2つのシステム間の正確な違いを理解することはできません。この違いが一番大きいのは何か知りたいです。この問題と今後発生する可能性のある同様の問題を解決することをお勧めします。
単にbashバージョンを変更した場合は、リリースノートまたはそれを示すコンテンツが見つかりません。そこにオプションが設定されていると見つかりません(ないかのようにset -u
)。 FWIW以下は、shopt
障害が発生したシステム(2番目の列)とエラーが発生していないシステム(3番目の列)の出力差です。
$ awk 'FNR==1{ARGIND++} {a[$1,ARGIND]=$2; b[$1]} END{for (var in b) if (a[var,1] != a[var,2]) print var, a[var,1], a[var,2]}' bad good | column -t
autocd off
compat32 off
localvar_unset off
lastpipe off
localvar_inherit off
complete_fullquote on
assoc_expand_once off
checkwinsize on off
globasciiranges on
compat40 off
compat41 off
compat42 off
inherit_errexit off
compat43 off
compat44 off
checkjobs off
expand_aliases on off
globstar off
progcomp_alias off
dirspell off
direxpand off
login_shell on off
あるUnixシステムではエラーが発生し、別のシステムではエラーが発生しない理由を正確に知っている人はいますか?
答え1
5.0 - アルファが変更されました。CHANGES
Bashソースのファイル次の項目があります。
This document details the changes between this version, bash-5.0-alpha, and
the previous version, bash-4.4-release.
[...]
y. If indirect expansion attempts to indirectly reference through an unset
variable, report an error.
以下は、この問題のメーリングリストにある著者の投稿です。https://lists.gnu.org/archive/html/bug-bash/2016-11/msg00165.html
設定されていない変数またはnull値を持つ変数を介して参照を間接拡張しようとすると、エラーであることは明らかです。 Bash-4.3には最高のエラーチェック機能がなく、bash-4.4はnullケースをキャプチャします。また、設定されていない変数ケースをキャプチャするように修正します。
実際、Bash 4.4にはヌルエラーがあります。
$ ./bash4.4 -c 'var=; echo ${!var}'
./bash4.4: : bad substitution