Как передать аргумент файла на мой bash script с помощью команды Terminal в Linux?
Итак, мой вопрос в том, как передать аргумент файла моему bash script с помощью команды Terminal в Linux?
На данный момент я пытаюсь сделать программу в bash, которая может принимать аргумент файла из терминала и использовать его как переменную в моей программе. Например, я запускаю
myprogram --file=/path/to/file
в терминале.
Моя программа
#!/bin/bash
File=(the path from the argument)
externalprogram $File (other parameters)
Как я могу добиться этого с помощью моей программы?
Ответы
Ответ 1
Это будет проще (и более "правильно", см. ниже), если вы просто запустите свой script как
myprogram /path/to/file
Затем вы можете получить доступ к пути в script как $1
(для аргумента # 1, аналогично $2
- аргумент # 2 и т.д.)
file="$1"
externalprogram "$file" [other parameters]
Или просто
externalprogram "$1" [otherparameters]
Если вы хотите извлечь путь из чего-то вроде --file=/path/to/file
, который обычно выполняется с помощью функции оболочки getopts
. Но это сложнее, чем просто ссылаться на $1
, и, кроме того, такие переключатели, как --file=
, являются необязательными. Я предполагаю, что ваш script требует, чтобы имя файла было предоставлено, поэтому нет смысла передавать его в опции.
Ответ 2
вы можете использовать getopt для обработки параметров в bash script. Есть немного объяснений для getopt там. вот пример:
#!/bin/sh
OPTIONS=$(getopt -o hf:gb -l help,file:,foo,bar -- "[email protected]")
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): [email protected]"
exit 1
fi
echo "help: $HELP"
echo "file: $FILE"
echo "foo: $FOO"
echo "bar: $BAR"
см. также:
Ответ 3
Bash поддерживает концепцию "Позиционные параметры". Эти позиционные параметры представляют собой аргументы, указанные в командной строке при вызове Bash script.
Позиционные параметры обозначаются именами $0
, $1
, $2
... и так далее. $0
- это имя самого script, $1
- первый аргумент script, $2
второй и т.д. $*
представляет все позиционные параметры, за исключением $0
( т.е. начиная с $1
).
Пример:
#!/bin/bash
FILE="$1"
externalprogram "$FILE" <other-parameters>
Ответ 4
Предполагая, что вы делаете, как предлагает Дэвид Заславский, так что первым аргументом просто является программа для запуска (нет необходимости в парсинге), вы имеете дело с вопросом о том, как передавать аргументы 2 и в вашу внешнюю программу. Здесь удобный способ:
#!/bin/bash
ext_program="$1"
shift
"$ext_program" "[email protected]"
shift
удалит первый аргумент, переименование остальных ($2
станет $1, and so on).
[email protected]`относится к аргументам, как массив слов (он должен быть процитирован!).
Если у вас должен быть синтаксис --file
(например, если есть программа по умолчанию для запуска, поэтому пользователь не обязательно должен ее поставить), просто замените 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