мне нужно сравнивать строки в оболочке:Как сравнить строки в Bourne Shell?
var1="mtu eth0"
if [ "$var1" == "mtu *" ]
then
# do something
fi
Но, очевидно, «*» не работает в Shell. Есть ли способ сделать это?
мне нужно сравнивать строки в оболочке:Как сравнить строки в Bourne Shell?
var1="mtu eth0"
if [ "$var1" == "mtu *" ]
then
# do something
fi
Но, очевидно, «*» не работает в Shell. Есть ли способ сделать это?
bash
Кратчайший фикс:
if [[ "$var1" = "mtu "* ]]
в Bash [[ ]]
не получает Глоб вспененные, в отличие от [ ]
(который должен, по историческим причинам).
bash --posix
О, я отвечал слишком быстро. Bourne оболочки, не Bash ...
if [ "${var1:0:4}" == "mtu " ]
${var1:0:4}
означает первые четыре символа $var1
.
/bin/sh
Ах, извините. Эмуляция POSIX Bash не проходит достаточно далеко; подлинная оригинальная оболочка Бурна не имеет ${var1:0:4}
. Вам нужно что-то вроде решения mstrobl.
if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ]
Используйте инструменты Unix. Программа cut
с радостью сократит строку.
if [ "$(echo $var1 | cut -c 4)" = "mtu " ];
... должен делать то, что вы хотите.
yes, но kinda heavy – 2008-10-08 16:37:29
Или, как пример оператора в = ~:
if [[ "$var1" =~ "mtu *" ]]
Вы можете позвонить expr
для сопоставления строк против регулярных выражений внутри сценариев Bourne Shell. Ниже, кажется, работает:
#!/bin/sh
var1="mtu eth0"
if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then
echo "match"
fi
Я хотел бы сделать следующее:
# Removes anything but first word from "var1"
if [ "${var1%% *}" = "mtu" ] ; then ... fi
Или:
# Tries to remove the first word if it is "mtu", checks if we removed anything
if [ "${var1#mtu }" != "$var1" ] ; then ... fi
Мне нравится использовать случай заявление для сравнения строк.
Тривиального пример
case "$input"
in
"$variable1") echo "matched the first value"
;;
"$variable2") echo "matched the second value"
;;
*[a-z]*) echo "input has letters"
;;
'') echo "input is null!"
;;
*[0-9]*) echo "matched numbers (but I don't have letters, otherwise the letter test would have been hit first!)"
;;
*) echo "Some wacky stuff in the input!"
esac
Я делал сумасшедшие вещи, как
case "$(cat file)"
in
"$(cat other_file)") echo "file and other_file are the same"
;;
*) echo "file and other_file are different"
esac
И это тоже работает, с некоторыми ограничениями, например, файлы не могут быть больше, чем пара мегабайт, а оболочка просто не видит нулей, поэтому, если один файл заполнен нулями, а другой - нет (и ничего другого), этот тест не увидит никакой разницы между этими двумя.
Я не использую сравнение файлов как серьезный пример, только пример того, как оператор case способен выполнять гораздо более гибкое сопоставление строк, чем доступно с помощью теста или выражения expr или других подобных выражений оболочки.
В Bourne оболочке, если я хочу, чтобы проверить, содержит ли строка другой строку:
if [ `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then
заключите echo ${String} | grep -c ${Substr}
с двумя `
обратными кавычками:
Чтобы проверить, является ли подстрока в начале или на end:
if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then
...
if [ `echo ${String} | grep -c "${Substr}$"` -eq 1 ] ; then
`$ {var1: 0: 4}` - откуда вы получили этот синтаксис? Это определенно не POSIX. – 2011-09-16 06:23:04
Моя версия разреза указывает, что позиции нумеруются начиная с 1. `` cut -c 1-4`` или `` cut -c -4`` возвращают правильное значение здесь. – jotr 2016-01-25 22:02:04