2009-09-24 322 views
17

說一個字符串可能像「a b」'c「'd」,我該如何檢查字符串中是否包含單/雙引號和空格?如何檢查一個字符串是否在bash shell中有空格

+0

爲什麼要這樣做?如果您試圖檢查「無效」文件名,則可以修改腳本以支持帶空格或引號的文件名。例如。 –

+0

你是說你想知道:a)空間周圍有單/雙引號b)單/雙引號以及空格c)與之完全不同的東西? – ezpz

+0

只是爲了檢查一個字符串是否有任何單引號和它是否有任何空間 – derrdji

回答

20
case "$var" in 
    *\ *) 
      echo "match" 
      ;; 
     *) 
      echo "no match" 
      ;; 
esac 
+1

我挑剔,但你不需要引用$ var。 – Idelic

+0

@Idelic,如果$ var未被設置,該怎麼辦? – Will

+0

這完全沒有引號,將打印「不匹配」。 – Idelic

1

怎麼樣類似的方法:

$ A="some string"; echo $A | grep \ | wc -l 
1 
$ A="somestring"; echo $A | grep \ | wc -l 
0 

6
string="a b '' c '' d" 
if [ "$string" == "${string//[\' ]/}" ] 
then 
    echo did not contain space or single quote 
else 
    echo did contain space or single quote 
fi 
4

便攜式辦法做到這一點是grep

S="a b '' c '' d" 
if echo $S | grep -E '[ "]' >/dev/null 
then 
    echo "It's a match" 
fi 

...有點難看,但保證工作無處不在。

+1

使用grep中的'-q'選項,不再需要'>/dev/null'。更好一點。 – Ray

21

您可以在bash中使用正則表達式:

string="a b '' c '' d" 
if [[ "$string" =~ \ |\' ]] # slightly more readable: if [[ "$string" =~ (|\') ]] 
then 
    echo "Matches" 
else 
    echo "No matches" 
fi 

編輯:

對於以上原因很明顯,這是更好地把正則表達式中的變量:

pattern=" |'" 
if [[ $string =~ $pattern ]] 

而且在雙方括號內不需要引號。它們不能在右側使用,或者正則表達式被改爲文字字符串。

+0

最清潔的一個國際海事組織,對我來說,我也添加了標籤,但看起來有點時髦,因爲我不得不把美元 - 報價放在那裏'pattern =「|'」$'| \ t'' - 有更清晰的方式嗎? – nhed

+1

@nhed:在單個字符的情況下,您可以使用字符模式而不是管道字符替代。這可能稍微不好看:'pattern = $'[''t]''。你也可以使用一個變量:'tab = $'\ t'; pattern =「|'| $ tab」'或者一個文字選項卡(這對於可讀性來說不是很好),方法是使用Ctrl-V-Tab鍵入。 –

1
function foo() { 
    echo "String: $*" 
    SPACES=$(($#-1)) 
    echo "Spaces: $SPACES" 
    QUOTES=0 
    for i in $*; do 
     if [ "$i" == "'" ]; then 
      QUOTES=$((QUOTES+1)) 
     fi 
    done 
    echo "Quotes: $QUOTES" 
    echo 
} 

S="string with spaces" 
foo $S 
S="single' 'quotes" 
foo $S 
S="single '' quotes" 
foo $S 
S="single ' ' quotes" 
foo $S 

產量:

String: string with spaces 
Spaces: 2 
Quotes: 0 

String: single' 'quotes 
Spaces: 1 
Quotes: 0 

String: single '' quotes 
Spaces: 2 
Quotes: 0 

String: single ' ' quotes 
Spaces: 3 
Quotes: 2 
7
[[ "$str" = "${str%[[:space:]]*}" ]] && echo "no spaces" || echo "has spaces" 
+1

請注意,這不會檢測標籤或換行符,對於那些好奇的人 –

0

我不知道爲什麼沒有人提到的[:空間:]設置。通常你不僅對檢測空間特徵感興趣。我經常需要檢測任何空白區域,例如標籤。 「grep」示例如下所示:

$ echo " " | egrep -q "[:space:]" && echo "Has no Whitespace" || echo "Has Whitespace" 
Has Whitespace 
$ echo "a" | egrep -q "[:space:]" && echo "Has no Whitespace" || echo "Has Whitespace" 
Has no Whitespace 
+0

對於那些對此解決方案感興趣的人,我的'grep'告訴我'字符類語法是[[:space:]],而不是[:space: ]'。否則,出色的解決方案 – jdferreira

+0

由於問題被標記爲「bash」,因此不需要啓動另一個進程來測試字符串:case *「String」in * [[:space:]] *)echo「match」;; esac' –

相關問題