Получение с помощью команды grep файлов, содержащих! #Abc

используйте массив.

#!/bin/bash

args=( --flag1 "$1" --flag2 "$2" )
[  "x$3" = xFALSE ] ||  args+=( --optflag1 "$3" )
[  "x$4" = xFALSE ] ||  args+=( --optflag2 "$4" )
[  "x$5" = xFALSE ] ||  args+=( --optflag3 "$5" )
[  "x$6" = xFALSE ] ||  args+=( --optflag4 "$6" )
[  "x$7" = xFALSE ] ||  args+=( --optflag5 "$7" )

program_name "${args[@]}"

это позволит правильно обрабатывать аргументы с пробелами.

[edit] Я использовал примерно эквивалентный синтаксис args=("${args[@]}" --optflag1 "$3" ), но G-Man предложил лучший способ.

2
16.11.2016, 14:12
2 ответа

вы должны написать

grep \\!\\#abc <file>

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

0
27.01.2020, 22:44

Итак, grep: grep -l '! #Abc' также требует список файлов для обработки:

grep -l '!#abc' ./*

работает со всеми файлами в текущем каталоге.

Для echo: echo "#! A" требуется немного больше цитирования, например:

$ echo '#!a'
#!a

$ echo '#'\!'a'
#!a

$ echo '#'\!a
#!a

$ echo "#!"a
#!a

$ echo "#"'!a'
#!a

$ echo $'#!a'
#!a

'#' - это символ комментария. Из LESS = + '/ ^ * COMMENTS' man bash :

КОММЕНТАРИИ

 В неинтерактивной оболочке или интерактивной оболочке, в которой параметр 
interactive_comments для магазина builtin включен (см. SHELL 
ВСТРОЕННЫЕ КОМАНДЫ ниже), слово, начинающееся с #, заставляет это слово и 
все оставшиеся символы в этой строке игнорироваться. Интерактивная оболочка 
без включенной опции interactive_comments не допускает комментариев 
. Параметр interactive_comments по умолчанию включен в интерактивных оболочках 
. 
 

Все, что следует за ним в одной строке, считается 'комментарием' и не обрабатывается, например:

$ echo one # two three
one

Если вы хотите Чтобы избежать его эффекта, вам нужно заключить его в кавычки или поместить сразу после другого непустого символа:

$ echo one t# wo three
one t# wo three

! - это «ключевой персонаж» истории.
Только верхушка айсберга: Из LESS = + '/ ^ * HISTORY EXPANSION' man bash :

HISTORY EXPANSION
Расширения истории вводятся появлением символа расширения истории, который есть! по умолчанию. Только обратная косая черта () и одинарные кавычки могут заключать в кавычки символ раскрытия истории, но символ раскрытия истории также рассматривается как кавычка, если он непосредственно предшествует закрывающей двойной кавычке в строке с двойными кавычками.


Итак, последний вопрос: Что значит #! на самом деле представляют? .

Ответ: Это зависит от обстоятельств. Также зависит от окружающих персонажей.
Зависит от того, цитируется оно (и как оно цитируется) или нет. И зависит от того, есть ли перед ним пробел и / или завершающий пробел.

При правильных кавычках - те же самые символы. Если не кавычки с начальным пробелом: комментарий. Если не кавычки, без начального пробела и без конечного пробела: раскрытие истории.
Если не кавычки, без начального пробела, с конечным пробелом: символы.

Это, конечно, предполагает, что оба параметра

shopt -p interactive_comments
shopt -po history

установлены. Каждый управляет соответствующим персонажем ( # и ! ) в интерактивных оболочках. В неинтерактивных оболочках всегда используется символ комментария, а раскрытие истории почти всегда не активируется.

0
27.01.2020, 22:44

Теги

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