![[[ -v var ]] は bash スクリプト内と CLI 内で動作が異なります](https://rvso.com/image/1672553/%5B%5B%20-v%20var%20%5D%5D%20%E3%81%AF%20bash%20%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E5%86%85%E3%81%A8%20CLI%20%E5%86%85%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%8C%E7%95%B0%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99.png)
いくつかの環境変数 (ユーザー 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"
それはコードのロジックとは逆です。