2009-09-24 16 views
17

文字列に "a b" c "d"のような文字列があると、文字列に含まれる単一引用符と空白があることを確認するにはどうすればいいですか?bashシェルに文字列にスペースが含まれているかどうかをチェックする方法

+0

なぜこれをやりたいのですか?たとえば、「無効な」ファイル名をチェックしようとしている場合は、スペースや引用符でファイル名をサポートするようにスクリプトを修正することができます。例えば。 –

+0

あなたは、次のことを知りたいと言っていますか?a)スペースの周りに一重/二重引用符があります。b)スペースと共に一重引用符と二重引用符があります。 – 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 

?ビット醜い

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

...、しかし、どこでも動作することが保証:

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です。

+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

私にとっても一番きれいなIMOですが、タブを追加しましたが、ドル記号を投げなければならないので、ちょっとファンキーに見えるのですが、パターン= "| '" $' | \ t " – nhed

+1

@nhed:1文字の場合は、パイプ文字の代わりに文字パターンを使用できます。やや醜いかもしれません: 'pattern = $ '[\' \ t] ''。変数を使うこともできます: 'tab = $ '\ t'; 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:]] ] '。それ以外の場合は、優れたソリューション! – jdferreira

+0

質問には "bash"というタグが付いているので、文字列をテストするために別のプロセスを起動する必要はありません: 'case" $ String "in * [[:space:]] *)echo" match ";;エサック –

関連する問題