Як порівняти змінну з рядком (і зробити щось, якщо вони збігаються)?
Як порівняти змінну з рядком (і зробити щось, якщо вони збігаються)?
Відповіді:
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
насправді вона " "
оточувала його як частину буквеного значення рядка, тому мені довелося використовувати символ утечі, $b
щоб порівняти значення. Мені вдалося знайти це після запуску bash -x ./script.sh
, прапор -x дозволяє бачити значення кожного виконання і допомагає в налагодженні.
Для порівняння рядків із символами підстановки
if [[ "$stringA" == *$stringB* ]]; then
# Do something here
else
# Do Something here
fi
"
навколо символів. (btw: +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 ...
. Не хвилюйтесь, це загальна проблема .
... && ... || ...
- цілком дійсний зразок та загальна бадіозна ідіома. Її використання передбачає попередні знання (про що, можливо, варто пам’ятати, якщо в аудиторії є початківці), але ОП має волосся, щоб довести, що вони знають, як уникнути відкритих кришок люків.
ви також можете використовувати case / 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/[
)
Можливо, я б скористався відповідниками regexp, якщо вхід містить лише кілька дійсних записів. Наприклад, лише "старт" і "стоп" є дійсними діями.
if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
echo "valid action"
fi
Зауважте, що я малу величину змінює $ACTION
, використовуючи подвійні коми. Також зауважте, що це не буде працювати над занадто постареними баш-версіями.
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" ]
або він не працює ... не може бути пробілів навколо рівних