Как сравнить 2 строки в сценарии оболочки UNIX?

Он устанавливает единый фрагмент конфигурации, который позволяет проверять подключение. См. раздел connectivityв man NetworkManager.conf.

Он указывает NetworkManager периодически получать HTTP определенный URL-адрес, чтобы решить, доступен ли Интернет. Основное использование — обнаружение закрытых порталов, например, в отеле.

Затем эту информацию могут использовать другие приложения. Подобно gnome -, оболочка может решить показать логин для авторизованных порталов и вопросительный знак на значке сети, чтобы сигнализировать об ограниченном подключении.

4
31.08.2018, 08:37
7 ответов

Простой ответ, чтобы вы могли использовать этот синтаксис:

if [ "$category" = "$request" ]

Интервал важен. Примечание: вы должны использовать последний способ выполнения подстановки команд и заменить (см. статью 1 и статью posix):

category=`echo $lines|sed -n -e 's/.*Summary: value//p'| awk '{print $1}'`

этим

category=$(echo $lines|sed -n -e 's/.*Summary: value//p'| awk '{print $1}')
14
27.01.2020, 20:44

Хочу лишь прокомментировать самую важную часть:

if($category = $request)

Оболочка ifработает по-другому, запуская команду и используя ее код возврата.

Примером является:

if /usr/bin/somecommand; then
    echo "somecommand exited with exit code 0 (success)"
fi

чтобы сравнить две строки, вы должны использовать

if /bin/test a = b; then
    echo "a=b"
fi

Обратите внимание, что testможет быть встроенной в вашу оболочку, но обычно она также используется в двоичном виде.

Следующее, что у вас обычно есть символическая ссылка от /bin/[до /bin/test. Это означает, что вы можете:

if [ a = b ]; then
    echo "a=b"
fi

, где [ a = b ]совпадает с test a = b, а конечный ]нужен для более красивого синтаксиса.
По этой причине if [a=b]не будет работать, так как приведенный выше синтаксис означает [ "a" "b" "]", где [— имя программы. Без пробела оболочка ищет [a=b].

Ваш синтаксис с использованием (a = b)использует подоболочку для запуска команды внутри, что приводит к команде a = b, где a считается именем программы.

Другая возможная ловушка вашего кода заключается в том, что переменные могут быть пустыми. Взгляните на этот код:

b=something
if [ $a = $b ]; then
    echo $a = $b
fi

Это приведет к ошибке, потому что это эквивалентноtest = something(запускуtest "=" "something"). echoниже имеет аналогичную проблему, но для эха это не имеет большого значения. Чтобы это исправить, используйте соответствующие кавычки:

b=something
if [ "$a" = "$b" ]; then
    echo "$a = $b"
fi

В результате появляется тестовая командная строка :test "" "=" "something", которая является правильной командой. Я исправил потенциальные проблемы в эхо-строке, поместив всю строку в кавычки, что делает их одним единственным параметром для эхо-команды (или встроенной ).

3
27.01.2020, 20:44

Мы должны использовать [вместо (в случае, если условие

Попробуйте:

 if [ "$category" = "$request" ]
  • ()используется для выполнения команды и проверки кода выхода.
  • []используется для проверки выражения.

И я надеюсь, что вы скопировали скрипт из MS -word, так как он имеет не -unix-символ

request=”Request”
fault=”Fault”

Изменить как

request="Request"
fault="Fault"
5
27.01.2020, 20:44

Другие уже указали на синтаксическую ошибку в вашем утверждении if.

Я также хотел бы прокомментировать тот факт, что вы, кажется, используете типографские двойные кавычки вместо обычных ". Вам также не нужно сохранять вывод sedв отдельной переменной с помощью этой подстановки команд. Вместо этого читайте из вывода awkнапрямую:

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '{ print $1 }' |
while IFS= read -r category; do
    case $category in
        Request|Fault)
            printf '%s\n' "$category"
            ;;
        Breakfast)
            echo 'Yum'
            ;;
        *)
            printf 'Unknown category: %s\n' "$category"
    esac
done

Или, если вам удобнееif-утверждения,

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '{ print $1 }' |
while IFS= read -r category; do
    if   [ "$category" = 'Request' ] || [ "$category" = 'Fault' ]; then
        printf '%s\n' "$category"
    elif [ "$category" = 'Breakfast' ]; then
        echo 'Yum'
    else
        printf 'Unknown category: %s\n' "$category"
    fi
done

Обратите внимание, что нет необходимости проверять, пуста ли строка. Пустую строку можно без проблем сравнить с другой строкой, если вы всегда заключаете в кавычки расширение переменной .

Или, если ваш скрипт ничего не делает, кроме этого:

#!/bin/ksh

sed -n 's/.*Summary: Value//p' <content.txt | awk '
    $1 == "Request" || $1 == "Fault" { print $1;    next }
    $1 == "Breakfast"                { print "Yum"; next }
                                     { printf("Unknown category: %s\n", $1) }

Связанные:

11
27.01.2020, 20:44

Вот более творческий способ. Если я правильно понял, вы хотите действовать только в том случае, если $category — это Order или Request (или любые две вещи )и действовать одинаково.

if (( $(echo -e "Request\nOrder\n$category" | sort -u | wc -l) == 2)); then
  echo $category
fi

Это просто использование того факта, что если используется нужное слово, сортировка удалит одну строку из-за того, что список станет уникальным (-u ). В противном случае список останется в три строки.

0
27.01.2020, 20:44

В дополнение к тому, что сказали все остальные ответы,

  1. awk— очень мощная программа. Редко вам нужно совмещать ее с другой командой форматирования текста -. Например,
    sed -n -e 's/.*Summary: Value//p' | awk '{print $1}'
    можно преобразовать в
    awk '{ if (sub(/.*Summary: Value/, "")) print $1 }'
  2. Вы всегда должны заключать переменные оболочки в кавычки (например, "$lines", "$category"и"$request")если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете.
  3. Как указал Кусалананда , Использование цикла оболочки для обработки текста считается плохой практикой . Как я сказал выше, awk— очень мощная программа. Я полагаю, вы понимаете, что ваш скрипт читает ваш файл по одной строке за раз, и вызываетawksed! )один раз для каждой строки. Не указывая на это явно, Кусалананда дал вам примеры решений которые запускаютawksed)один раз для всего файла; последний помещает всю логику в скрипт awk, а не в шелл-код. Это, вероятно, лучший подход, если все, что вы делаете, это печатаете строки, как показывает ваш вопрос. Но даже если вам нужно запустить другие команды на основе ввода, вы можете сделать это, используя функцию system()в awk. Сложность вашей задачи будет решающим фактором при принятии решения о том, какой подход лучше.
1
27.01.2020, 20:44

Это должно работать, поскольку в вашем заявленииif($category = $request)

вместо []указано ().
#!/bin/ksh
request="Request"
fault="Fault"
while read lines; do
    category=$(echo $lines|sed -n -e 's/.*Summary: Value//p'| awk '{print $1}')
    if [ ! -z "$category" ]
    then
        if [[ $category = $request ]]
        then
            echo $category
        fi
     fi
    done<input.txt

    #contents of input.txt
    Summary: Value Request
    Summary: Value Order
0
27.01.2020, 20:44

Теги

Похожие вопросы