Как сравнить переменную bash с двойными кавычками

Правильный синтаксис:

7z a isos.7z *.iso

или

7z a isos.7z chakra-2015.11-fermi-x86_64.iso openSUSE-Leap-42.1-DVD-x86_64.iso PCBSD10.2-RELEASE-08-19-2015-x64-DVD-USB.iso Sabayon_Linux_15.11_amd64_MATE.iso

-121--209644-

Длина пароля в диалоговом окне учетной записи пользователя всегда показывает пять точек (• • • •) независимо от фактической длины пароля . В противном случае, это будет утечка информации, что (теоретически) облегчит злоумышленнику грубую силу или иным образом угадает ваш пароль.

enter image description here

Обратите внимание, что команда su ищет пароль root . Если вы настроили свою учетную запись в качестве администратора, вы можете даже не установить ее во время установки. В этом случае используйте sudo , который даст доступ в корневом эквиваленте с использованием собственного пароля.

-121--202520-

grep -n '^include ' yourfile |
sed  -e 's/:[^ ]* /{ r /'    \
     -e 'G;s/.$/&b&}/'       |
sed -nf - -ep       yourfile

, которые должны работать. grep находит те , которые включают в себя номера строк, первый sed изменяет свой вывод на специфичные для номера строки команды [num] {r fname\nb\n} , а второй sed p печатает каждую строку, которая не является одним из первых скриптов для него.

{   for   x in  a b
    do    echo "do $x">"file$x.xyz"
          echo "include file$x.xyz"
    done; printf "do %s\n"  c d
}   >yourfile
cat  yourfile

include filea.xyz
include fileb.xyz
do c
do d

Создается образец и отображается файл .

И это работает:

grep -n '^include ' yourfile |
sed  -e 's/:[^ ]* /{ r /'    \
     -e 'G;s/.$/&b&}/'       |
sed -nf - -ep       yourfile

do a
do b
do c
do d

файлы ead r могут быть любого размера, хотя, конечно, и не ограничиваются одной строкой. Однако сами имена файлов ограничены одной строкой, но в остальном они являются более или менее неограниченными (в зависимости от вашего sed - некоторые старые seds имели произвольные ограничения длины имени, но большинство используемых сегодня не имеют) .

1
19.04.2019, 20:59
3 ответа

Код в вопросе работает, то есть он выполнит оператор exit 0.

Ваш

STATUS=`echo "test"`

совпадает с

STATUS="test"

и (в данном случае )как

STATUS=test

т.е. переменной STATUSприсваивается testзначение (в значении )нет двойных кавычек.

Чтобы проверить это на значении test, выполните

if [ "$STATUS" = "test" ]

или

if [[ $STATUS == "test" ]]

Если STATUSимеет значение "test", как в

STATUS='"test"'

затем используйте эту строку в сравнении:

if [ "$STATUS" = '"test"' ]

или

if [[ $STATUS == '"test"' ]]

См. также:

6
27.01.2020, 23:18

Решение этой проблемы может отличаться в зависимости от того, какую оболочку вы используете. Кроме того, убедитесь, что $STATUS содержит «тест» перед сравнением со строкой «echo $STATUS» в вашем скрипте. Проверка содержимого переменных очень полезна для отладки. Хотя маловероятно, есть небольшой шанс, что какая-то другая программа устанавливает его, и в этом случае он явно не сработает.

Вообще говоря, написанный вами код ДОЛЖЕН работать. Если это не проблема, возможно, проблема связана с каким-либо другим кодом в сценарии, самой оболочкой или какой-либо другой программой. Вы можете попробовать экспортировать системную переменную с помощью экспорта, чтобы убедиться, что она установлена ​​​​правильно. Это должно переопределить любые мешающие значения. Имейте в виду, что если другая программа мешает работе, ей может не понравиться изменение ее переменных.

В качестве справки приведу следующую информацию:

Лучший способ установить переменную в простое состояние, такое как «тест», это просто:

VARIABLE="value"

Хотя вы можете использовать эхо для возврата текста в переменную, для таких строк, как test, в этом нет необходимости. Если вы не собираетесь вставлять управляющие символы, такие как перевод строки, с помощью команды echo -e или printf.

Рекомендуемый способ сравнения строки — любой из этих:

if [ "$VARIABLE" = "value" ]; then
if [[ $VARIABLE == value ]]; then

Если вы еще не пробовали его, попробуйте использовать более новый [[, также известный как расширенный тест, вместо [, также известный как классический тест.

http://wiki.bash-hackers.org/commands/classictest

http://wiki.bash-hackers.org/syntax/ccmd/conditional_expression

Это отличные ресурсы, которые помогут вам получить дополнительную информацию, если вы хотите узнать все подробности об операторах тестирования.

0
27.01.2020, 23:18

Эти экранированные кавычки в \"test\"наводят меня на мысль, что есть некоторая путаница в правилах цитирования оболочки, потому что первая часть кода работает так, как предполагалось, и $STATUS == \"test\"не должна (, если вы не написали STATUS=`echo '"test"'`или нечто подобное ).

Чтобы должным образом прояснить эту путаницу, необходимо объяснить некоторые концепции оболочки.


Цитирование

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

Основные правила следующие:

  1. Экранирующий символ\:Сохраняет буквальное значение следующего за ним символа, за исключением <newline>.
  2. Двойные кавычки":Сохраняет буквальное значение всех символов в кавычках, за исключением $, `, \и, когда расширение истории включено, !.
  3. Одинарные кавычки':Сохраняет буквальное значение всех символов в кавычках без исключений.

Подстановка команды

Подстановка команд позволяет выводу команды заменить саму команду. Его синтаксис либо $(command), либо `command`, хотя первый предпочтительнее.

Тестовая команда

Команда test(, также известная как [в POSIX и [[в таких оболочках, как bash, ksh и zsh ), позволяет использовать множество полезных условных и арифметических выражений. Например, он может проверить, существует ли данный обычный файл и доступен ли он для чтения, равны ли две строки или больше ли число, чем другое.


Итак,анализ кода:

STATUS=`echo "test"`

Подстановка команды здесь бесполезна, так как ее можно было бы записать как STATUS="test". Обратите внимание, что echoне печатает двойные кавычки, поэтому STATUSсодержит testв качестве своего значения.

if [ $STATUS == "test" ]; then
   exit 0
fi

Вот как минимум 3 потенциальных недостатка:

  1. $STATUSбез кавычек может быть затронуто разделением слов.
  2. ==не является синтаксисом -POSIX. Используйте =, если вам важна портативность.
  3. ifи exit 0бесполезны в этом сценарии, так как [уже выполняет намеченную работу.

Кроме того, обратите внимание, что, как и в предыдущей строке кода, двойные кавычки не воспринимаются буквально, поэтому результирующая команда (после раскрытия и удаления кавычек )будет [ test = test ], что верно.


Но если вашей целью было получить "test"в качестве значения STATUS, тогда

STATUS=\"test\"
STATUS="\"test\""
STATUS='"test"'

— все допустимые назначения, а

[ "$STATUS" = \"test\" ]
[ "$STATUS" = "\"test\"" ]
[ "$STATUS" = '"test"' ]

являются допустимыми условными выражениями.

1
27.01.2020, 23:18

Теги

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