Bash

在 if 條件中出現錯誤

  • August 9, 2022

我只是在檢查密碼是否包含一個小寫大寫字母,我在第 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 -rin讀取密碼,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]

shshell 中,您可以這樣編寫腳本:

#!/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

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