Osx
‘==’ 邏輯運算符和 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
簡單的答案: 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 不匹配時。因此
==
,在該命令的一個參數中,[
要求外殼程序在其中查找=
命令,$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
,否則會出現一些令人困惑的錯誤(更糟糕的是,在(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
進行模式匹配(萬用字元,而不是正則表達式))請注意,這些是條件表達式,無需區分賦值運算符和相等運算符,因此不需要
==
運算符。