почему команда не работает должным образом при обнаружении подстановочного знака

сегмент кода из сценария оболочки

 fname=$(sed 's/(.*//' <<< $p | awk '{ print $NF }')  
 if [[ $fname == *['!'@#\$%^\&*()_+]* ]]
 then
   flag1=0
 fi

, где $ p - одна строка из текстового файла.

значение p равно > = (коротко) BigBlock * DISK_SIZE + Size)

когда указанный выше сценарий оболочки выполняется для значения p, он дает мусорный результат например, это появляется на терминале

>= (short)BigBlock  file1 file2 file3 DISK_SIZE + Size)

, где файл1 файл2 файл3 - это файлы в папке

, я предполагаю, что * обрабатывается как команда ls

, что могло бы быть возможным решением

-2
22.09.2017, 00:43
2 ответа

Для начала, ожидая реальной строки значения $p :, обязательно заключайте $p в кавычки.

fname=$(sed 's/(.*//' <<< "$p" | awk '{ print $NF }') 

Также обратите внимание, sed 's/(.*//'соответствует концу строки.

f='(something) and more stuff';sed 's/(.*//' <<< "$f"

Результатом, конечно же, является пустая строка.

f='(something)-and more stuff';sed 's/([^)]*)//' <<< "$f"

Результаты в:-и многое другое

0
28.01.2020, 05:17

Резюме :Вероятно, где-то в вашем коде есть echo $p. Вам нужно удвоить -цитату $p.


Нет, *не считается командой ls. Однако он рассматривается как шаблон подстановки имени файла из-за того, что он используется без кавычек где-то (, а не в коде, показанном в вопросе )

.

Необходимо соблюдать осторожность при назначении и использовании значения pи использовать соответствующие кавычки для защиты строки.

Шаблоны подстановки имен файлов здесь не раскрываются -строки:

$ cat <<< *
*

Таким образом, нет ничего плохого в использовании $pбез кавычек в вызове sed. Однако почти всегда лучше указывать расширения переменных в кавычках. См. также использование $fnameбез кавычек в вашем тесте. Это должно быть двойное цитирование наверняка.

Вы говорите, что скрипт выводит текст

>= (short)BigBlock  file1 file2 file3 DISK_SIZE + Size)

Нет ничего, что могло бы спровоцировать вывод этой строки в сценарии, указанном в вопросе. Вероятно, это связано с тем, что вы делаете

echo $p

где-то еще в сценарии.

Опять же, используйте двойные кавычки вокруг$p:

echo "$p"

Таким образом, вы не даете оболочке выполнить подстановку имени файла на его значение (расширение*).

Как правило, используйте echoтолько для статических строк и используйте printfдля переменных данных:

printf '$p is "%s"\n' "$p"

В связи с последним пунктом:Почему printf лучше, чем echo?

1
28.01.2020, 05:17

Теги

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