Оболочка, выполняющая сценарий, не является -интерактивной оболочкой.
Не -интерактивная оболочка все еще может использовать, например. read
для чтения данных со стандартного ввода.
Если стандартный ввод является терминалом, это может обеспечить уровень «взаимодействия», но это не делает оболочку, выполняющую сценарий, интерактивной оболочкой. Хотя в четверг скрипт будет "интерактивным".
Текст сбивает с толку, потому что слово «интерактивный» используется для обозначения двух вещей:
tr 'a-z' 'A-Z'
сам по себе «интерактивно» превратит все строчные символы ASCII в прописные. Да, это возможно. С помощью метода, который я покажу ниже, позаботьтесь об использовании кавычек, подстановочных знаков и т. д. Тем не менее, вот одно решение вBASH
:
opt="-iname '*.srt' -o -iname '*.mp4'"
find. \( $(eval echo ${opt}) \)
Хотя невозможно просто вызвать переменную ${opt}
в команде find
, мы можем обойти это, используя команду eval
в строке $(eval echo ${opt})
.
В реализации GNU find
есть еще один способ поиска по нескольким именам файлов:
rgx='.*\.srt\|.*\.mp4'
find. -iregex "$rgx"
\|
является логическим ИЛИ (в типах регулярных выражений GNU по умолчанию find
, которые являются типами emacs ). Голый .
означает любой уголь. а точка \.
.
Вы можете определить $rgx_compr
и $rgx_media
, а затем объединить их:
find. -iregex "$rgx_compr" -o -iregex "$rgx_media"
Здесь я опустил скобки.
Поскольку вы используете оболочку, которая поддерживает переменные-массивы (, то есть bash
), вы можете создать переменную-массив и использовать ее напрямую.
Постоянное выражение
find. \( -iname "*.srt" -o -iname "*.mp4" \)...
Переменное выражение
opts=(-iname "*.srt" -o -iname "*.mp4")
find \( "${opts[@]}" \)...
Или
opts=( '(' -iname "*.srt" -o -iname "*.mp4" ')' )
find "${opts[@]}"...
Обратите внимание, что само раскрытие переменной массива должно быть заключено в двойные -кавычки ("${opts[@]}"
), даже если оно содержит один или несколько элементов. Если массив не содержит элементов, он расширится до ничего(не пустая строка,""
).