Bash
在 if 條件中出現錯誤
我只是在檢查密碼是否包含一個小寫大寫字母,我在第 19 行遇到錯誤。
myscript.sh
:#!bin/sh read password conditionarr=(0 0) if [[ $password =~ [A-Z] ]] then condtionarr[1]=1 fi if [[ $password =~ [a-z] ]] then conditionarr[0]=1 fi if [ ${conditionarr[0]} == 1 || ${conditionarr[1]} == 1 ] then printf "%s" "Yes\n " else printf "%s" "No\n" fi
錯誤:
./myscript.sh: line 19: [: missing `]' ./myscript.sh: line 19: 0: command not found
這段程式碼有什麼問題?誰能告訴我如何解決這個問題?
您的程式碼中有幾個問題:
- 該
#!
-line 應該讀取#!/bin/bash
(或解釋器或系統的完整絕對路徑bash
)。請注意,您使用的 shell 程式碼需要使用bash
,因此將#!
-line指向sh
解釋器是不正確的,因為該 shell 可能無法理解諸如 non-standard[[ ... ]]
或數組的使用之類的東西。- 可能應該使用
IFS= read -s -r
in讀取密碼,bash
以避免將輸入回顯到終端,並允許使用\
沒有問題,並允許側翼空格等。- 多個測試更好地編寫
[ ... ] || [ ... ]
。這就是導致您的實際錯誤消息的原因。該[
實用程序不知道||
.建議:
#!/bin/bash IFS= read -p 'Enter password: ' -sr password check=(0 0) [[ $password =~ [A-Z] ]] && check[0]=1 [[ $password =~ [a-z] ]] && check[1]=1 if [ "${check[0]}" = 1 ] || [ "${check[1]}" = 1 ]; then echo yes else echo no fi
或者,擺脫對數組的需求:
#!/bin/bash IFS= read -p 'Enter password: ' -sr password if [[ $password =~ [A-Z] ]] || [[ $password =~ [a-z] ]] then echo yes else echo no fi
請注意,可以在一個測試中
$password
使用.[A-Z]
[a-z]``[A-Za-z]
在
sh
shell 中,您可以這樣編寫腳本:#!/bin/sh printf 'Enter password: ' >&2 state=$(stty -g) # save stty state stty -echo # turn off local echo IFS= read -r password stty "$state" # reset stty state to original case $password in *[A-Za-z]*) echo yes ;; *) echo no esac
請注意,我已將大小寫字元的測試組合到一個測試中,並且使用的模式
case
是 shell 萬用字元模式,而不是正則表達式。如果您需要檢查大小寫字母,您仍然需要兩個單獨的測試*:*
case $password in (*[A-Z]*) check1=true;; (*) check1=false; esac case $password in (*[a-z]*) check2=true;; (*) check2=false; esac if "$check1" && "$check2"; then echo yes else echo no fi