сегмент кода из сценария оболочки
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
, что могло бы быть возможным решением
Для начала, ожидая реальной строки значения $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"
Результаты в:-и многое другое
Резюме :Вероятно, где-то в вашем коде есть 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?