Я хочу написать сценарий оболочки Unix, который будет выполнять различную логику, если внутри другой строки есть строка. Например, если я нахожусь в определенной папке, разветвляйтесь. Может кто-нибудь сказать мне, как это сделать? Если возможно, я хотел бы сделать это не специфичным для оболочки (т.е. не только bash), но если нет другого способа, я могу с этим справиться.
#!/usr/bin/env sh
if [ "$PWD" contains "String1" ]
then
echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
echo "String2 present"
else
echo "Else"
fi
CURRENT_DIR
избыточна; вы можете просто использовать$PWD
.Ответы:
Вот еще одно решение. При этом используется расширение параметра подстроки POSIX , поэтому оно работает в Bash, Dash, KornShell (ksh), Z shell (zsh) и т. Д.
Функционализированная версия с некоторыми примерами:
источник
substring="$( printf '%q' "$2" )"
спасает положение.[[ $haystack == *"My needle"* ]]
[]
. См. Мой ответ stackoverflow.com/a/54490453/712666 .Чистая оболочка POSIX:
Расширенные оболочки, такие как ksh или bash, имеют причудливые механизмы сопоставления, но старый стиль
case
на удивление эффективен.источник
К сожалению, я не знаю, как это сделать в sh. Однако, используя bash (начиная с версии 3.0.0, которая, вероятно, у вас есть), вы можете использовать оператор = ~ следующим образом:
В качестве дополнительного бонуса (и / или предупреждения, если в ваших строках есть забавные символы) = ~ принимает регулярные выражения в качестве правильного операнда, если вы опускаете кавычки.
источник
[[ test =~ "test.*" ]]
vs.[[ test =~ test.* ]]
.источник
grep -q "$2"
на,grep -q "$2" > /dev/null
чтобы избежать нежелательного вывода.Вот ссылка на различные решения вашей проблемы.
Это мой любимый вариант, поскольку он наиболее понятен человеку:
Метод подстановочных знаков звездочки
источник
sh
я получил "неизвестный операнд". Хотя работает с Bash.[[
это не POSIXисточник
Есть регулярные выражения Bash . Или есть expr:
источник
-> вывод: строка 1 содержит строку 2
источник
См. Справочную страницу "тестовой" программы. Если вы просто проверяете наличие каталога, вы обычно делаете что-то вроде этого:
Если вы на самом деле пытаетесь сопоставить строку, вы также можете использовать правила и подстановочные знаки bash:
Если вам нужно сделать что-то более сложное, вам нужно будет использовать другую программу, например expr.
источник
В особых случаях, когда вы хотите узнать, содержится ли слово в длинном тексте, вы можете перебирать длинный текст с помощью цикла.
Это чистая оболочка Борна.
источник
Если вам нужен метод только для ksh, который работает так же быстро, как test, вы можете сделать что-то вроде:
Он работает, удаляя иголку в стоге сена, а затем сравнивая длину строки старого и нового стога сена.
источник
test
? Как вreturn [ ${#haystack} -eq ${#1} ]
?