Динамически назначайте переменную в скрипте bash, которая анализирует путь ОС - PullRequest
0 голосов
/ 26 августа 2018

Кажется, я не могу понять это правильно. Когда я запускаю этот код, мне нужна переменная для имени файла позже.Как мне это сделать?

#!/bin/bash

foo="../../../data/audio/serval-data/wav-16bit-16khz/ytdl/balanced_train/vidzyGjrJfE_rg.wav"

echo $foo
echo "${foo%.*}" | cut -d "/" -f10;

# fid=vidzyGjrJfE_rg

Я хочу использовать новую переменную fid, чтобы иметь значение "vidzyGjrJfE_rg"

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Плохой ответ (для вашего конкретного вопроса), к которому я обращаюсь на тот случай, если вам действительно нужно назначить результат команды в будущем (здесь не нужен):

fid=$(echo "${foo%.*}" | cut -d "/" -f10)

, которыйзахватывает stdout того, что вы хотите запустить, так что вы можете легко назначить его.Конечно, в вашем случае использовать echo, трубу или cut не нужно, и ответ @ melpomene - хороший ответ.

0 голосов
/ 27 августа 2018

Вы можете использовать для этого пару итераций встроенных командных оболочек (см. @ ответ melpomene ), но, к вашему сведению, именно для этого существует basename:

$ foo="../../../data/audio/serval-data/wav-16bit-16khz/ytdl/balanced_train/vidzyGjrJfE_rg.wav"
$ fid=$(basename "$foo" '.wav')
$ echo "$fid"
vidzyGjrJfE_rg
0 голосов
/ 26 августа 2018

Вы можете сделать это следующим образом:

fid="${foo##*/}"
fid="${fid%.*}"

Так же, как % удаляет совпадающий суффикс из переменной, # удаляет префикс (а ## удаляет самый длинный совпадающий префикс).Смотри https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...