Как сравнить переменную с строкой (и сделать что-то, если они совпадают)?
Как сравнить строки в Bash
Ответ 1
Использование переменных в операторах if
if [ "$x" = "valid" ]; then
echo "x has the value 'valid'"
fi
Если вы хотите что-то сделать, когда они не совпадают, замените =
на !=
. Вы можете прочитать больше о строковых операциях и арифметических операциях в их соответствующей документации.
Почему мы используем кавычки около $x
?
Вы хотите, чтобы кавычки были около $x
, потому что если он пуст, ваш bash-скрипт встречает синтаксическую ошибку, как показано ниже:
if [ = "valid" ]; then
Нестандартное использование оператора ==
Обратите внимание, что bash
позволяет использовать ==
для равенства с [
, но это не стандартно.
Используйте либо первый случай, когда кавычки около $x
являются необязательными:
if [[ "$x" == "valid" ]]; then
или используйте второй случай:
if [ "$x" = "valid" ]; then
Ответ 2
Или, если вам не нужно предложение else:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
Ответ 3
a="abc"
b="def"
# Equality Comparison
if [ "$a" == "$b" ]; then
echo "Strings match"
else
echo "Strings don't match"
fi
# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
echo "$b is lexicographically smaller than $a"
else
echo "Strings are equal"
fi
Примечания:
- Пространства между
if
и[
и]
важны -
>
и<
являются операторами перенаправления, поэтому избегайте их с помощью\>
и\<
соответственно для строк.
Ответ 4
Для сравнения строк с подстановочными знаками используйте
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
Ответ 5
Я должен не согласиться с одним из комментариев в одном пункте:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Нет, это не сумасшедший oneliner
Это просто похоже на одного, хм, непосвященного...
Он использует общие шаблоны как язык, в некотором роде;
И после того, как вы выучили язык.
На самом деле, приятно читать
Это простое логическое выражение с одной специальной частью: ленивая оценка логических операторов.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Каждая часть является логическим выражением; первое может быть истинным или ложным, остальные два всегда верны.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Теперь, когда он оценивается, проверяется первое. Если это ложь, то второй операнд логики и &&
после него не имеет значения. Во-первых, это неверно, поэтому в любом случае это не может быть первым и вторым.
Теперь в этом случае первая сторона логики или ||
false, но это может быть правдой, если другая сторона - третья часть - истинна.
Таким образом, третья часть будет оценена - в основном, запись сообщения в качестве побочного эффекта. (Он имеет результат 0
для истины, который мы здесь не используем)
Другие случаи похожи, но проще - и - я обещаю! - может быть - легко читать!
(У меня его нет, но я думаю, что стать ветераном UNIX с седой бородой очень помогает.)
Ответ 6
вы также можете использовать прецедент /esac
case "$string" in
"$pattern" ) echo "found";;
esac
Ответ 7
после script читается из файла с именем "testonthis" по строке, а затем сравнивает каждую строку с простой строкой, строкой со специальными символами и регулярным выражением, если она не соответствует, тогда script будет печатать строку o/w не.
пространство в bash так важно. поэтому последующие будут работать
[ "$LINE" != "table_name" ]
но следующее не будет:
["$LINE" != "table_name"]
поэтому, пожалуйста, используйте как есть:
cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done
Ответ 8
Я бы, вероятно, использовал совпадения регулярных выражений, если на входе было всего несколько действительных записей. Например. действительными действиями являются только "старт" и "остановка".
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Обратите внимание, что я строчу переменную $ACTION
с помощью двойной запятой. Также обратите внимание, что это не будет работать на слишком старых версиях bash.
Ответ 9
Bash4+. Примечание: не использовать кавычки вызовет проблемы, когда слова содержат пробелы и т.д. Всегда указывайте в bash IMO.
Вот несколько примеров Bash4+:
Пример 1, проверьте "да" в строке (без учета регистра):
if [[ "${str,,}" == *"yes"* ]] ;then
Пример 2, проверьте "да" в строке (без учета регистра):
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
Пример 3, проверьте "да" в строке (с учетом регистра):
if [[ "${str}" == *"yes"* ]] ;then
Пример 4, проверьте "да" в строке (с учетом регистра):
if [[ "${str}" =~ "yes" ]] ;then
Пример 5, точное совпадение (с учетом регистра):
if [[ "${str}" == "yes" ]] ;then
Пример 6, точное совпадение (без учета регистра):
if [[ "${str,,}" == "yes" ]] ;then
Пример 7: точное совпадение:
if [ "$a" = "$b" ] ;then
наслаждаться.
Ответ 10
Я сделал это таким образом, который совместим с bash, dash (sh):
testOutput="my test"
pattern="my"
case $testOutput in (*"$pattern"*)
echo "if there is a match"
exit 1
;;
(*)
! echo there is no coincidence!
;;esac