Osx

‘==’ 邏輯運算符和 zsh 版本 5.7.x(使用 Homebrew 安裝)

  • February 28, 2019

使用此運算符時,我的腳本出現錯誤。我有一些線上文件,雙等號應該可以工作。有任何想法嗎?

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

簡單的答案: a==是僅在構造內部的邏輯運算符。[[ … ]]

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

它也適用於 ksh 和 bash。

當在[[ … ]]構造之外使用時, =cmd 成為文件名擴展運算符,但僅在 zsh 中

$ echo ==
zsh: = not found

這就是[ … ]您使用的更簡單的構造內部發生的情況。

但是測試執行 shell 腳本的使用者是 root 的正確方法是:

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

=cmd是一個文件名擴展運算符zsh它擴展為cmd(通過查找 解決$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,否則會出現一些令人困惑的錯誤(更糟糕的是,在(like )$_user之外的類似 Korn 的 shell 中包括任意命令注入漏洞)。zsh``bash

您還可以通過禁用在腳本中不是很有用的equals選項 ( )來禁用該功能。set +o equals

或者使用ksh-style[[...]]構造:

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

case構造:

case $_user in
 (root) ...
esac

( [[ = ]],[[ == ]]case進行模式匹配(萬用字元,而不是正則表達式))

請注意,這些是條件表達式,無需區分賦值運算符和相等運算符,因此不需要==運算符。

引用自:https://unix.stackexchange.com/questions/502061