2009-09-24 5 views
17

сказать, что строка может быть похожа на «a», «c», «d», как я могу проверить, что есть одна/двойная кавычка и пробел, содержащиеся в строке?Как проверить, имеет ли строка пробелы в оболочке bash

+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

С опцией '-q' в grep' '/ dev/null' больше не требуется. Немного приятнее. – Ray

21

Вы можете использовать регулярные выражения в Баш:

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

Edit:

По причинам, очевидным выше, то лучше поставить регулярное выражение в переменной:

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

И цитаты не нужны внутри двойных квадратных скобок. Они не могут использоваться справа или регулярное выражение изменено на буквенную строку.

+0

чистейший один IMO, для меня я также добавил вкладку, но выглядит немного напуганным, поскольку мне пришлось бросить долларовую цитату там '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

Я удивляюсь, почему никто не упомянул [: пространство:] установлено. Обычно вы не только заинтересованы в обнаружении космического персонажа. Мне часто приходится обнаруживать любое пустое пространство, например. TAB. Пример «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' сообщает мне, что синтаксис символьного класса [[: пробел:]], а не [: пробел: ] '. В противном случае, отличное решение! – jdferreira

+0

Поскольку вопрос помечен как «bash», нет необходимости запускать другой процесс, чтобы проверить строку: 'case '$ String" in * [[: space:]] *) echo "match" ;; esac' –

Смежные вопросы