Подтвердить что ты не робот

Как передать аргумент файла на мой 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)

Как я могу добиться этого с помощью моей программы?

4b9b3361

Ответ 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