"=="論理演算子とzshバージョン5.7.x(Homebrewを使用してインストール)

"=="論理演算子とzshバージョン5.7.x(Homebrewを使用してインストール)

この演算子を使用すると、スクリプトにエラーが発生します。オンラインにはいくつかの文書があり、二重等号が機能するはずです。どんなアイデアがありますか?

Zshリファレンスガイド:http://zsh.sourceforge.net/Doc/Release/Conditional-Expressions.html

スクリプト:

#!/bin/zsh

if [ $_user == "root" ]; then
    echo "root"
else
    echo "not root"
fi

実行してください:

$ ./script.sh
./script.sh:3: = not found

答え1

簡単な答え:aは==aです論理演算子[[ … ]]構造物内部でのみ可能です。

$ [[ one == one ]] && echo "yes"
yes

kshとbashでも動作します。

[[ … ]]構造物外で使用される場合=cmdは次のようになります。ファイル名拡張演算子しかしzshでのみ

$ echo ==
zsh: = not found

[ … ]これはあなたが使用するより簡単な構成で起こるものです。

ただし、シェルスクリプトを実行しているユーザーがrootであるかどうかをテストする正しい方法は次のとおりです。

if (( EUID == 0 )); then
    echo "root"
else
    echo "not root"
fi

答え2

=cmdファイル名拡張演算子ですこれはzshパスに拡張されますcmd(lookupによって解決されます$PATH)。対応するコマンドが存在しない場合、例えばglobが一致しない場合、致命的なエラーが発生します。

したがって、==コマンドの引数では、シェルはコマンドを見つけて、[そのコマンドがないことを知らせるように要求します。=$PATHzsh=

$ echo =ls
/bin/ls
$ echo ==
zsh: = not found
$ install -m 755 /dev/null ~/bin/=
$ echo ==
/home/stephane/bin/=

ここでは、コマンドの標準構文を使用できます[

[ "$_user" = root ]

または引用=

[ "$_user" '==' root ]

また、引用符に一致する正規表現が必要です。

[ "$_user" '=~' '^ro+t$' ]

とにかく引用したいです$_user。それ以外の場合は空または設定されていないと混乱するエラーが発生します$_user(より悪いことはzsh(like bash)以外のKorn様シェルの任意のコマンド注入の脆弱性を含みます)。

無効化equalsオプション(set +o equals)を使用してこの機能を無効にすることもできます。これはスクリプトではあまり役に立ちません。

またはksh-style[[...]]構成を使用します。

[[ $_user = root ]]
[[ $_user == root ]]
[[ $_user =~ '^ro+t$' ]]

またはcase構成:

case $_user in
  (root) ...
esac

[[ = ]]および[[ == ]]パターンcaseマッチング(正規表現ではなくワイルドカード))

これは代入演算子と恒等演算子の間の明確性を必要としない条件式であるため、演算子は必要ありません==

答え3

接線的な短い答え..他のシェル型で実行するために書かれた例を読んでいますか?

$ zsh -c 'if [ "x" == "x" ]; then echo "equal!"; fi'
zsh:1: = not found

$ bash -c 'if [ "x" == "x" ]; then echo "equal!"; fi'
equal!

関連情報