答え1
でzsh
、=cmd
は、コマンドのパスに展開するファイル名展開演算子ですcmd
。=cmd
は に似ています$commands[cmd]
。
したがって、ここでは、コマンド==
の引数の 1 つで[
、それがコマンドのパスに拡張されます。で=
呼び出されるコマンドがないため、エラーが発生します。=
$PATH
比較する:
$ echo =ls
/bin/ls
$ echo =junk
zsh: junk not found
コマンド内の等価演算子[
は です=
。[
コマンドはテストのみを実行し、代入は実行しないため、他の言語にあるような代入演算子と等価比較演算子を区別する必要はありません ( C の=
vs==
や他の言語の:=
vsなど)。=
つまり、次のようになります。
[ "$USER" = root ]
それでも、[
の はzsh
、 の と同様に、 の代替としてksh
サポートされていますが、オプションを無効にしない限り (エミュレーションの場合のように)、その演算子を回避するには、少なくとも最初の を引用符で囲む必要があります。==
=
equals
ksh
=
=cmd
[ "$USER" '==' root ]
は$USERNAME
によって自動的に設定されますがzsh
、$USER
は設定されません ( などによって環境変数として設定されますがlogin
)。
スーパーユーザー権限があるかどうかをテストするには、実効ユーザー ID が 0 であることを確認する方が確実です。これは、zsh
またはbash
で、[ "$EUID" -eq 0 ]
または を使用して実行できます。(( EUID == 0 ))
参照:
答え2
この行は実際には構文的には正しくありません (ただし、bash
処理されます)。
if [ $USER == 'root' ]
...==
のみを使用し、それ以外の場合は使用してください。 ...構文を使用する場合は、二重引用符を使用することをお勧めします。[[
]]
=
$USER
[
]
if [[ "$USER" == 'root' ]]
または
if [ "$USER" = 'root' ]