set -u 使用法が期待どおりに機能しません。

set -u 使用法が期待どおりに機能しません。

私はsetスクリプトでさまざまなオプションを効果的に使用する方法を学んでいますが、set -uこれが変数が正しく設定されていない場合(ユーザーの削除など)、スクリプトを終了するのに最適な方法です。 ~によると男性ページをset -uクリックしてset -e以下を実行してください...

-e  Exit immediately if a command exits with a non-zero status.
-u  Treat unset variables as an error when substituting.

この機能をテストするためにテストスクリプトを作成しましたが、期待どおりに機能しないようです。たぶん誰かが私の問題を私にもっとよく説明し、私が誤解している部分を説明できますか?テストスクリプトは次のとおりです。ありがとうございます。

set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}

スクリプトを表示したいです。0そして「これ効果がある」${testing2}設定されていないため失敗します。

代わりに見せてください。0そして「これ効果がある」、遵守する0それから0 このようなことは起こってはいけません。

誰でも知識を提供できますか?ありがとうございます。

答え1

「男乱交」から:

パラメータに値が割り当てられている場合は、パラメータが設定されます。空の文字列は有効な値です。変数が設定されている場合は、unset組み込みコマンドでのみ設定を解除できます。

これにより、testing2=変数は空の文字列に設定されます。

に変更しunset testing2てもう一度やり直してください。


この場合、set -e割り当てには終了コード1がないため役に立ちません。最後に実行されたコマンド (割り当て) の終了コードが 0 であることを確認するには、次のようにします。この質問を読んでください:

$ false; a=""; echo $?
0

そして私はset -eを使うのが解決策ではなく問題が多いと思います。

設定されていない変数を使用するとエラーが発生する可能性がありますset -u

#!/bin/bash
set -u
testing="This works"
echo ${testing}
unset testing2
echo ${testing2}
testing3="This should not appear"
echo ${testing3}

以下を出力します。

$  ./script.sh
This works
./script.sh: line 9: testing2: unbound variable

答え2

testing2=testing2変数を実際には空の文字列に設定します。設定しました

echo $testing99errexitただし、対話型 Bash シェル (setup なし、つまり) で実行している場合、set -e次のエラーが発生します。

bash: testing99: unbound variable

横に

私はスクリプトをテストしながら発見しました。インタラクティブシェル いつも出てこない変数を拡張しようとしたときまだ設定されていませんそして一つ非対話型シェル(シェルスクリプトの実行)常に終了。 POSIXのマニュアルページによるとset

-uシェルが設定されていない変数を拡張しようとし、すぐに終了した場合は、標準エラーにメッセージを書き込む必要があります。対話型シェルは終了しないでください。

インタラクティブな Bash シェルは、以下でなければerrexit終了しません。返品設定しました。一方、インタラクティブなダッシュボードシェルは、set -e以前に実行されても終了しません。

関連情報