скажем, что строка может быть похожа на "a b" 'c' 'd ", как я могу проверить, что в строке есть одиночная/двойная кавычка и пробел?
Как проверить, имеет ли строка пробелы в оболочке bash
Ответ 1
case "$var" in
*\ * )
echo "match"
;;
*)
echo "no match"
;;
esac
Ответ 2
Вы можете использовать регулярные выражения в bash:
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 ]]
И цитаты не нужны внутри двойных квадратных скобок. Они не могут использоваться справа или регулярное выражение заменено на литеральную строку.
Ответ 3
[[ "$str" = "${str%[[:space:]]*}" ]] && echo "no spaces" || echo "has spaces"
Ответ 4
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
Ответ 5
Портативный способ сделать это с помощью grep
:
S="a b '' c '' d"
if echo $S | grep -E '[ "]' >/dev/null
then
echo "It a match"
fi
... немного уродливый, но гарантированный для работы везде.
Ответ 6
Как насчет подхода, подобного:
$ A="some string"; echo $A | grep \ | wc -l
1
$ A="somestring"; echo $A | grep \ | wc -l
0
?
Ответ 7
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
Ответ 8
Я удивляюсь, почему никто не упомянул набор [: space:]. Обычно вы не только заинтересованы в обнаружении космического персонажа. Мне часто приходится обнаруживать любое пустое пространство, например. 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