Как передать аргумент файла в мой скрипт bash, используя Терминальная команда в Linux? [duplicate]

На этот вопрос уже есть ответ:

Итак, мой вопрос: как я могу передать аргумент файла в мой bash-скрипт с помощью команды Terminal в Linux? В данный момент я пытаюсь создать программу на bash, которая может принимать аргумент файла из терминала и использовать его в качестве переменной в моей программе. Например я бегу myprogram --file = / path / to / file в терминале.

Моя программа

#!/bin/bash    
File=(the path from the argument)  
externalprogram $File (other parameters)

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

42
задан Philipp 20 August 2010 в 19:49
поделиться

4 ответа

вы можете использовать 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"

см. также:

20
ответ дан 26 November 2019 в 23:37
поделиться

Будет проще (и более «правильно», см. Ниже), если вы просто запустите свой сценарий как

myprogram /path/to/file

. Затем вы можете получить доступ к пути в сценарии как $ 1 (для аргумента № 1 , аналогично $ 2 - аргумент №2 и т. д.)

file="$1"
externalprogram "$file" [other parameters]

Или просто

externalprogram "$1" [otherparameters]

Если вы хотите извлечь путь из чего-то вроде - file = / path / to / file , что обычно выполняется с помощью функции оболочки getopts . Но это сложнее, чем просто ссылка на $ 1 , и, кроме того, такие переключатели, как - file = , должны быть необязательными. Я предполагаю, что ваш сценарий требует указания имени файла , поэтому нет смысла передавать его в параметре .

56
ответ дан 26 November 2019 в 23:37
поделиться

Bash поддерживает концепцию, называемую «Позиционные параметры». Эти позиционные параметры представляют собой аргументы, которые указываются в командной строке при вызове сценария Bash.

Позиционные параметры обозначаются именами $ 0 , $ 1 , $ 2 ... и так далее. $ 0 - это имя самого скрипта, $ 1 - первый аргумент скрипта, $ 2 - второй и т. Д. $ * представляет все позиционные параметры, кроме $ 0 (т.е. начиная с $ 1 ).

Пример:

#!/bin/bash
FILE="$1"
externalprogram "$FILE" <other-parameters>
12
ответ дан 26 November 2019 в 23:37
поделиться

Предполагая, что вы поступаете так, как предлагает Дэвид Заславский, так что первый аргумент просто - это программа, которую нужно запустить (анализ опций не требуется), вы имеете дело с вопросом о том, как передавать аргументы 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
2
ответ дан 26 November 2019 в 23:37
поделиться