Можно ли распечатать содержание содержимого переменной с помощью скрипта оболочки? (косвенные ссылки)

Не используйте ни grep , ни ls , но find :

find . -name 'rf*.img'

GNU find имеет возможность распечатать только каталог ( -printf "% h \ n" ), но в вашем случае это не вариант.

Вы можете сделать что-то вроде:

find . -name 'rf*.img' | sed 's:/[^/]*$::'

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

find . -name 'rf*.img' -exec dirname {} \; | sed 's:./\([^/]*\).*:\1:'
13
30.06.2018, 12:47
3 ответа

Вы можете сделать это, используя косвенное раскрытие переменной bash (, если вы можете опустить $из ссылочной переменной):

$ var=test
$ test="my string"
$ echo "$var"
test
$ echo "${!var}"
my string

3.5.3 Расширение параметров оболочки

22
27.01.2020, 19:52

В случае, когда имя переменной, содержащееся в var, имеет префикс $, вы можете использоватьeval:

$ var='$test'
$ test="my string"
$ eval echo $var
my string

Что здесь происходит:

  • bash расширяет $varдо значения $test, создавая команду eval echo $test;
  • evalоценивает выражение echo $testи дает желаемый результат.

Обратите внимание, что использование evalв целом может быть опасным (в зависимости от того, что хранится в var), поэтому лучше его избегать. Функция непрямого расширения лучше подходит для вашего случая (, но вам нужно избавиться от входа $в$test).

11
27.01.2020, 19:52

Сzsh:

$ var='$test'
$ test='*'
$ printf '%s\n' ${(e)var}
*

С любой борновской -оболочкой

$ eval 'printf "%s\n" "'"$var"'"'
*

Помните, что в этих оболочках расширения переменных должны заключаться в кавычки, чтобы разделение + glob(zshне было исключением ), а echoнельзя использовать для произвольных данных.

Поскольку и в (e), и в evalесть оценка шелл-кода, важно, чтобы содержимое $varоставалось под вашим контролем, иначе это может привести к уязвимости с внедрением произвольной команды (, то же самое с подходами ${!var}. ).

3
27.01.2020, 19:52

Теги

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