Как сравнить переменную со строкой (и сделать что-то, если они совпадают)?
Как сравнить переменную со строкой (и сделать что-то, если они совпадают)?
Ответы:
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
[ "$1" == "on" ]
. Изменение этого значения на ["$ 1" = "on"] решило проблему.
=
а не два.
[ $x -eq "valid" ]
. -eq
является оператором сравнения целых чисел, а не строк.
["x$yes" == "xyes"]
, то есть префикс переменной и строкового литерала с x
? Это пережиток старины или он действительно нужен в некоторых ситуациях?
Или, если вам не нужно еще пункт:
[ "$x" == "valid" ] && echo "x has the value 'valid'"
echo
может потерпеть неудачу.
[ "$X" == "valid" ] || ( echo invalid && false ) && echo "valid"
.
{ echo invalid && false; }
более эффективен ( echo invalid && false )
, так как позволяет избежать оплаты за ненужную подоболочку.
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
и [
и ]
важны>
и <
являются операторами перенаправления, поэтому избегайте его с \>
и \<
соответственно для строк.$a
самом деле " "
окружение было частью строкового литерала, поэтому мне пришлось использовать escape-символ $b
для сравнения значений. Я смог найти это после запуска bash -x ./script.sh
, флаг -x позволяет увидеть значение каждого выполнения и помогает в отладке.
Для сравнения строк с подстановочными знаками используйте
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
символы подстановки. (кстати: +1 для подстановочных знаков!)
$stringB
должно быть заключено в кавычки (и, кстати, левая рука не должна быть указана): if [[ $stringA = *"$stringB"* ]]; then
.
Я должен не согласиться с одним из комментариев в одной точке:
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Это просто похоже на одного, хм, непосвященного ...
Он использует общие шаблоны как язык, в некотором смысле;
И после того, как вы выучили язык.
Это простое логическое выражение, состоящее из одной специальной части: ленивая оценка логических операторов.
[ "$x" == "valid" ] && echo "valid" || echo "invalid"
Каждая часть является логическим выражением; первое может быть истинным или ложным, два других всегда истинны.
(
[ "$x" == "valid" ]
&&
echo "valid"
)
||
echo "invalid"
Теперь, когда оно оценивается, проверяется первое. Если оно ложно, то второй операнд логики и &&
после него не актуален. Первое не соответствует действительности, поэтому оно не может быть первым, а второе, в любом случае, верно.
Теперь, в данном случае это первая сторона логики или ||
ложь, но это может быть правдой, если другая сторона - третья часть - верна.
Таким образом, третья часть будет оценена - в основном, написание сообщения в качестве побочного эффекта. (У него есть результат 0
для истины, который мы здесь не используем)
Другие случаи похожи, но проще - и я обещаю! легко читать!
(У меня его нет, но я думаю, что ветеран UNIX с седой бородой очень помогает в этом.)
... && ... || ...
вызывает недовольство (извините, седовласый ветеран Unix, вы все время ошибались), поскольку это не семантически эквивалентно if ... then ... else ...
. Не волнуйтесь, это распространенная ошибка .
... && ... || ...
это совершенно правильный шаблон и общая идиома bash. Его использование действительно предписывает предварительные знания (что может быть полезно иметь в виду, если в аудитории есть новички), но у ОП есть шанс доказать, что они знают, как избегать открытых крышек люков.
Вы также можете использовать вариант использования / ESAC
case "$string" in
"$pattern" ) echo "found";;
esac
|
перед )
. in
Утверждение эквивалентно then
в if
отчетности. Вы можете утверждать, что он работает со списком шаблонов, где каждый список имеет свое собственное объявление о том, что делать, если вы пришли из Python. Не как substring in string
, а скорее for item in list
. Используйте в *
качестве вашего последнего утверждения, если вы хотите else
условие. Возвращается при первой встрече.
Следующий скрипт читает строку из строки с именем «testonthis», а затем сравнивает каждую строку с простой строкой, строкой со специальными символами и регулярным выражением. Если он не совпадает, то скрипт напечатает строку, иначе нет.
Пространство в Баш очень важно. Так что будет работать следующее:
[ "$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
bash
но потому что [
это на самом деле внешний двоичный файл (как в случае с which [
чем-то вроде /usr/bin/[
)
Я бы, вероятно, использовал регулярные выражения, если на входе есть только несколько допустимых записей. Например, только «старт» и «стоп» являются допустимыми действиями.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Обратите внимание, что я строчные буквы переменной $ACTION
, используя двойные запятые. Также обратите внимание, что это не будет работать на слишком старых версиях bash.
Bash 4+ примеров. Примечание: неиспользование кавычек приведет к проблемам, когда слова содержат пробелы и т. Д. Всегда заключайте в Bash, IMO.
Вот несколько примеров в Bash 4+:
Пример 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
Наслаждаться.
if [ "$a"="$b" ]
или это не работает ... не может быть пробелов вокруг равных
Я сделал это так, чтобы это было совместимо с 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
(
неиспользованием предыдущего ?