この演算子を使用すると、スクリプトにエラーが発生します。オンラインにはいくつかの文書があり、二重等号が機能するはずです。どんなアイデアがありますか?
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が一致しない場合、致命的なエラーが発生します。
したがって、==
コマンドの引数では、シェルはコマンドを見つけて、[
そのコマンドがないことを知らせるように要求します。=
$PATH
zsh
=
$ 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!