我想檢查字串的第一個字符是大寫、小寫還是其他任何字符。我嘗試了這段代碼,但else盡管前兩個條件為假,但我無法進入最后一個。
#!/bin/bash
echo "enter var: "
read var
if [[ {$var::1 =~ [A-Z] ]]
then
echo "UpperCase"
elif [[ {$var::1} =~ [a-z] ]]
then
echo "LowerCase"
else
echo "Digit or a symbol"
fi
exit
當我輸入時,1hello我得到:“小寫”
我在這里錯過了什么?!
uj5u.com熱心網友回復:
您不一定需要提取第一個字符,您可以將整個字串與模式進行比較。
在這里,我使用了POSIX字符類[:upper:]和[:lower:]我覺得這更多的描述。它們還處理非 ASCII 字母。
正則匹配:
if [[ $var =~ ^[[:upper:]] ]]; then echo starts with an upper
elif [[ $var =~ ^[[:lower:]] ]]; then echo starts with a lower
else echo does not start with a letter
fi
隨著shell glob模式-內[[...]]的==運營商做模式匹配不只是字串相等
if [[ $var == [[:upper:]]* ]]; then echo starts with an upper
elif [[ $var == [[:lower:]]* ]]; then echo starts with a lower
else echo does not start with a letter
fi
一個case宣告將在這里作業,以及
case "$var" in
[[:upper:]]*) echo starts with an upper ;;
[[:lower:]]*) echo starts with a lower ;;
*) echo does not start with a letter ;;
esac
uj5u.com熱心網友回復:
您的引數擴展都不正確。{$var::1計算為{1hello::1,不是1,{$var::1}同樣計算為{1hello::1}。
您想要的擴展是${var::1},它確實1按預期擴展。
無論如何,您不需要花哨的引數擴展;您可以單獨使用正則運算式匹配第一個字符
[[ $var =~ ^[a-z] ]]
或模式匹配
[[ $var = [a-z]* ]]
正則運算式不是隱式錨定的,因此可以使用^顯式匹配字串的開頭;字串的其余部分可以忽略。
模式匹配隱式地錨定到字串的開頭和結尾,因此您需要*匹配字串初始字符之后的所有內容(如果有的話)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/400943.html
標籤:猛击
