Написание сценария Unix (bash), который создает каталог в месте, указанном в командной строке
В настоящее время у меня есть сценарий Unix (написанный на bash), который выполняет несколько команд для изменения группы файлов, которые я указываю с помощью flist, содержащего их пути. Основная идея сценария - создать каталог, поместить файлы из flist в этот каталог, а затем выполнить последующие процессы, некоторые из которых создают дополнительные каталоги.
Проблема, с которой я столкнулся, заключается в том, что я должен указать точный путь к файлу, где я хочу, чтобы каталоги находились внутри самого скрипта. Итак, мой вопрос: есть ли способ написать сценарий так, чтобы я мог ввести команду, а затем путь к папке назначения, где я хотел бы, чтобы сценарий выполнялся в командной строке и имел начальный и все последующие каталоги, созданные сценарием в начальном каталоге без необходимости указывать какой-либо из их путей (т. е. 'command /destination/path/for/script/')?
Извинения, если это немного затянуто. Я довольно новичок в Unix и у меня очень мало опыта (и, следовательно, я не смог придумать лучшую формулировку). Любая помощь приветствуется!
2 ответа
Если я вас правильно понимаю, вы спрашиваете, как передать значения в скрипт bash. Это очень просто, например:
#!/usr/bin/env bash
directory=$1;
echo "Directory is $directory"
$1
это первый аргумент командной строки скрипта bash. $2
второй и т. д. Итак, вы можете запустить скрипт выше так:
./foo.sh /path/to/bar
Directory is /path/to/bar
Если вы хотите, чтобы команда также была переменной, вы можете сделать что-то вроде этого:
#!/usr/bin/env bash
command=$1;
directory=$2
$command $directory
Итак, бежать ls /etc
, вы должны запустить скрипт выше, как это:
./foo.sh ls /etc
Я представляю, что у вас есть файлы в месте (/path/to/originals
) и хотите скопировать их в целевое местоположение (/path/to/destination
) и измените их потом. Ваш текущий скрипт выглядит так:
mkdir /path/to/destination
cp /originals/this-file /path/to/destination
cp /originals/this-other-file /path/to/destination
modify-somehow /path/to/destination/this-file
modify-somehow /path/to/destination/this-other-file
но вам не нравится иметь жесткий код / путь / к / месту назначения везде. Таким образом, вы можете попросить использовать "значение первого позиционного параметра" вместо жесткого кодирования /path/to/destination
, Как уже упоминалось, значение первого позиционного параметра $1
,
Итак, ваш сценарий должен быть:
mkdir $1
cp /originals/this-file $1
cp /originals/this-other-file $1
modify-somehow $1/this-file
modify-somehow $1/this-other-file
И вы должны вызвать это, добавив путь назначения в качестве аргумента:
my-script /path/to/destination
Я пытался сделать скрипт простым, но вы могли бы улучшить его, например, используя один cp
Команда для копирования нескольких файлов. Вы также можете использовать переменную для вашего /originals
путь (но вместо аргумента этот звучит как объявление константы в начале вашего скрипта)
Наконец, учтите, что если в именах ваших файлов есть пробелы, вам нужно $1
в двойных кавычках.