Он устанавливает единый фрагмент конфигурации, который позволяет проверять подключение. См. раздел connectivity
в man NetworkManager.conf
.
Он указывает NetworkManager периодически получать HTTP определенный URL-адрес, чтобы решить, доступен ли Интернет. Основное использование — обнаружение закрытых порталов, например, в отеле.
Затем эту информацию могут использовать другие приложения. Подобно gnome -, оболочка может решить показать логин для авторизованных порталов и вопросительный знак на значке сети, чтобы сигнализировать об ограниченном подключении.
Простой ответ, чтобы вы могли использовать этот синтаксис:
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}')
Хочу лишь прокомментировать самую важную часть:
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"
, которая является правильной командой. Я исправил потенциальные проблемы в эхо-строке, поместив всю строку в кавычки, что делает их одним единственным параметром для эхо-команды (или встроенной ).
Мы должны использовать [
вместо (
в случае, если условие
Попробуйте:
if [ "$category" = "$request" ]
()
используется для выполнения команды и проверки кода выхода. []
используется для проверки выражения. И я надеюсь, что вы скопировали скрипт из MS -word, так как он имеет не -unix-символ”
request=”Request”
fault=”Fault”
Изменить как
request="Request"
fault="Fault"
Другие уже указали на синтаксическую ошибку в вашем утверждении 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) }
Связанные:
Вот более творческий способ. Если я правильно понял, вы хотите действовать только в том случае, если $category — это Order или Request (или любые две вещи )и действовать одинаково.
if (( $(echo -e "Request\nOrder\n$category" | sort -u | wc -l) == 2)); then
echo $category
fi
Это просто использование того факта, что если используется нужное слово, сортировка удалит одну строку из-за того, что список станет уникальным (-u ). В противном случае список останется в три строки.
В дополнение к тому, что сказали все остальные ответы,
awk
— очень мощная программа. Редко вам нужно совмещать ее с другой командой форматирования текста -. Например, sed -n -e 's/.*Summary: Value//p' | awk '{print $1}'можно преобразовать в
awk '{ if (sub(/.*Summary: Value/, "")) print $1 }'
"$lines"
, "$category"
и"$request"
)если у вас нет веской причины не делать этого, и вы уверены, что знаете, что делаете. awk
— очень мощная программа. Я полагаю, вы понимаете, что ваш скрипт читает ваш файл по одной строке за раз, и вызываетawk
(и sed
! )один раз для каждой строки. Не указывая на это явно, Кусалананда дал вам примеры решений которые запускаютawk
(иsed
)один раз для всего файла; последний помещает всю логику в скрипт awk
, а не в шелл-код. Это, вероятно, лучший подход, если все, что вы делаете, это печатаете строки, как показывает ваш вопрос. Но даже если вам нужно запустить другие команды на основе ввода, вы можете сделать это, используя функцию system()
в awk
. Сложность вашей задачи будет решающим фактором при принятии решения о том, какой подход лучше. Это должно работать, поскольку в вашем заявлении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