[[ -v var ]] は bash スクリプト内と CLI 内で動作が異なります

[[ -v var ]] は bash スクリプト内と CLI 内で動作が異なります

いくつかの環境変数 (ユーザー ID、パスワード、トークン) がまだ存在しない場合に、それらをデフォルト値に設定する bash スクリプトが必要です。存在テストは CLI では機能しますが、スクリプトでは機能しません。

magilla@raspberrypi:~ $ ps -p $$
    PID TTY          TIME CMD
   3005 pts/0    00:00:05 bash
magilla@raspberrypi:~ $ echo "${BASH_VERSION}"
5.1.4(1)-release

magilla@raspberrypi:~ $ env | grep var
magilla@raspberrypi:~ $ [[ -v var ]] && echo "\${var} not defined" || echo "\${var} is defined"
${var} not defined

magilla@raspberrypi:~ $ cat myscript
#!/bin/bash
[[ -v var ]] && echo "\${var} not defined" || echo "\${var} is defined"
magilla@raspberrypi:~ $ bash myscript
${var} is defined
magilla@raspberrypi:~ $ bash < myscript
${var} is defined

答え1

どうやらvar対話型シェルで設定されているようです (ただし、環境には設定されていません)。その後、[[ -v var ]]成功が返され、echo "\${var} not defined"実行されます。

not definedコードのロジックが間違っているからです。

スクリプトvarが設定されていない場合は、[[ -v var ]]失敗を返してecho "\${var} is defined"実行されます。

なぜなら、この論理は再び間違っているからですis defined。次の論理は理にかなっています。

[[ -v var ]] && echo "\${var} is defined" || echo "\${var} not defined"

それはコードのロジックとは逆です。

関連情報