Я копирую + вставляю ваш скрипт из комментария выше с добавлением разрывов строк в ;
признаки читабельности:
!/bin/bash
printf "%s\n" "Please enter full path to the vmfile location e.g. /path/to - "
read
vmfile_path=$REPLY
cd $vmfile_path
7za e -y ls -a | grep 001 -o`pwd`
Для начала первая строка должна быть #!/bin/bash
если что-нибудь, но я думаю, что это опечатка.
Ваша команда read
и последующая строка написаны легче, чем просто read vmfile_path
. Таким образом, шебанг также может быть изменен на #!/bin/sh
так как вы не будете использовать какие-либо специальные функции Bash.
Вы должны заключать в кавычки аргумент cd
для обработки имен каталогов с пробелами.
Я предполагаю, что вы хотите извлечь файл, имя которого содержит строку 001
в последней строке. Прямо сейчас не хватает подмены процесса, и ваше намерение, вероятно, ближе к:
7za e -y $(ls -a | grep 001) -o$(pwd)
Синтаксис $()
легче читать (и имеет некоторые другие преимущества) по сравнению с обратными метками, но он делает то же самое.
Я также предположил бы, что выходной каталог по умолчанию выводится pwd
, что делает его излишним, но я точно не знаю.
Ваша команда не понравится, если существует более одного имени файла, соответствующего 001
.
Игнорируя последнюю проблему, вы бы хотели всего что-то вроде:
#!/bin/sh
printf '%s\n' "Please enter full path to the vmfile location e.g. /path/to - "
read vmfile_path
cd "$vmfile_path"
7za e -y "$(ls -a | grep 001)" -o"$(pwd)"
Или, проще, замените последние две строки (также будет обрабатывать несколько совпадений) (хотя это не проверено):
find "$vmfile_path" -maxdepth 1 -name '*001*' -exec 7za e -y -o"$vmfile_path" {} \;
Шаблон соответствия имени, вероятно, можно улучшить, если вы знаете больше имени файла.