Написание сценария 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 в двойных кавычках.

Другие вопросы по тегам