いくつかの環境変数 (ユーザー 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"
それはコードのロジックとは逆です。