На этот вопрос уже есть ответ:
Итак, мой вопрос: как я могу передать аргумент файла в мой bash-скрипт с помощью команды Terminal в Linux?
В данный момент я пытаюсь создать программу на bash, которая может принимать аргумент файла из терминала и использовать его в качестве переменной в моей программе. Например я бегу
myprogram --file = / path / to / file
в терминале.
#!/bin/bash
File=(the path from the argument)
externalprogram $File (other parameters)
Как этого добиться с помощью моей программы?
вы можете использовать getopt для обработки параметров в вашем сценарии bash. Есть не так много объяснений getopt. вот пример:
#!/bin/sh
OPTIONS=$(getopt -o hf:gb -l help,file:,foo,bar -- "$@")
if [ $? -ne 0 ]; then
echo "getopt error"
exit 1
fi
eval set -- $OPTIONS
while true; do
case "$1" in
-h|--help) HELP=1 ;;
-f|--file) FILE="$2" ; shift ;;
-g|--foo) FOO=1 ;;
-b|--bar) BAR=1 ;;
--) shift ; break ;;
*) echo "unknown option: $1" ; exit 1 ;;
esac
shift
done
if [ $# -ne 0 ]; then
echo "unknown option(s): $@"
exit 1
fi
echo "help: $HELP"
echo "file: $FILE"
echo "foo: $FOO"
echo "bar: $BAR"
см. также:
man getopt
Будет проще (и более «правильно», см. Ниже), если вы просто запустите свой сценарий как
myprogram /path/to/file
. Затем вы можете получить доступ к пути в сценарии как $ 1
(для аргумента № 1 , аналогично $ 2
- аргумент №2 и т. д.)
file="$1"
externalprogram "$file" [other parameters]
Или просто
externalprogram "$1" [otherparameters]
Если вы хотите извлечь путь из чего-то вроде - file = / path / to / file
, что обычно выполняется с помощью функции оболочки getopts
. Но это сложнее, чем просто ссылка на $ 1
, и, кроме того, такие переключатели, как - file =
, должны быть необязательными. Я предполагаю, что ваш сценарий требует указания имени файла , поэтому нет смысла передавать его в параметре .
Bash поддерживает концепцию, называемую «Позиционные параметры». Эти позиционные параметры представляют собой аргументы, которые указываются в командной строке при вызове сценария Bash.
Позиционные параметры обозначаются именами $ 0
, $ 1
, $ 2
... и так далее. $ 0
- это имя самого скрипта, $ 1
- первый аргумент скрипта, $ 2
- второй и т. Д. $ *
представляет все позиционные параметры, кроме $ 0
(т.е. начиная с $ 1
).
Пример:
#!/bin/bash
FILE="$1"
externalprogram "$FILE" <other-parameters>
Предполагая, что вы поступаете так, как предлагает Дэвид Заславский, так что первый аргумент просто - это программа, которую нужно запустить (анализ опций не требуется), вы имеете дело с вопросом о том, как передавать аргументы 2 и на вашу внешнюю программу. Вот удобный способ:
#!/bin/bash
ext_program="$1"
shift
"$ext_program" "$@"
Сдвиг
удалит первый аргумент, переименовав остальные ( $ 2
станет $ 1 и т. Д.).
$ @ `относится к аргументам как к массиву слов (он должен быть заключен в кавычки!).
Если у вас должен быть синтаксис - файла
(например, если есть программа по умолчанию для запуска, поэтому пользователю не обязательно ее указывать), просто замените ext_program = «$ 1»
с любым анализом $ 1
, который вам нужен, возможно, с использованием getopt или getopts.
Если вы хотите использовать свое собственное, только для одного конкретного случая, вы можете сделать что-то вроде этого:
if [ "$#" -gt 0 -a "${1:0:6}" == "--file" ]; then
ext_program="${1:7}"
else
ext_program="default program"
fi