Вопрос

Мне нужно сравнить строки в оболочке:

var1="mtu eth0"

if [ "$var1" == "mtu *" ]
then
    # do something
fi

Но очевидно, что "*" не работает в Shell.Есть ли способ это сделать?

Это было полезно?

Решение

<код> баш

Самое короткое исправление:

if [[ "$var1" = "mtu "* ]]

Bash [[]] не расширяется глобально, в отличие от [] (что должно быть по историческим причинам).

<Ч>

bash --posix

О, я написал слишком быстро. Оболочка Борна, а не Баш ...

if [ "${var1:0:4}" == "mtu " ]

$ {var1: 0: 4} означает первые четыре символа $ var1 .

<Ч>

<код> / бен / ш

Ах, прости. Эмуляция POSIX от Bash не заходит достаточно далеко; настоящая оригинальная оболочка Bourne не имеет $ {var1: 0: 4} . Вам понадобится что-то вроде решения mstrobl.

if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ]

Другие советы

Используйте инструменты Unix. Программа cut будет счастливо сокращать строку.

if [ "$(echo $var1 | cut -c 4)" = "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

В оболочке Bourne, если я хочу проверить, содержит ли строка другую строку:

if [  `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then

Вложите echo $ {String} | grep -c $ {Substr} с двумя обратными галочками `:

Чтобы проверить, находится ли подстрока в начале или в конце:

if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then
...
if [ `echo ${String} | grep -c "${Substr}<*>quot;` -eq 1 ] ; then

Мне нравится использовать оператор case для сравнения строк.

Тривиальный пример

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 способен выполнять гораздо более гибкое сопоставление строк, чем это доступно с test или expr или другими подобными выражениями оболочки.

Или, как пример оператора = ~ :

if [[ "$var1" =~ "mtu *" ]]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top