Не используйте ни 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:'
Вы можете сделать это, используя косвенное раскрытие переменной bash (, если вы можете опустить $
из ссылочной переменной):
$ var=test
$ test="my string"
$ echo "$var"
test
$ echo "${!var}"
my string
В случае, когда имя переменной, содержащееся в var
, имеет префикс $
, вы можете использоватьeval
:
$ var='$test'
$ test="my string"
$ eval echo $var
my string
Что здесь происходит:
$var
до значения $test
, создавая команду eval echo $test
; eval
оценивает выражение echo $test
и дает желаемый результат. Обратите внимание, что использование eval
в целом может быть опасным (в зависимости от того, что хранится в var
), поэтому лучше его избегать. Функция непрямого расширения лучше подходит для вашего случая (, но вам нужно избавиться от входа $
в$test
).
Сzsh
:
$ var='$test'
$ test='*'
$ printf '%s\n' ${(e)var}
*
С любой борновской -оболочкой
$ eval 'printf "%s\n" "'"$var"'"'
*
Помните, что в этих оболочках расширения переменных должны заключаться в кавычки, чтобы разделение + glob(zsh
не было исключением ), а echo
нельзя использовать для произвольных данных.
Поскольку и в (e)
, и в eval
есть оценка шелл-кода, важно, чтобы содержимое $var
оставалось под вашим контролем, иначе это может привести к уязвимости с внедрением произвольной команды (, то же самое с подходами ${!var}
. ).