Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: Передача аргументов bash скрипту после ключа, как?  (Прочитано 2355 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Jolly Roger

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Привет всем!
Поделитесь пожалуйста примером скрипта в котором можно передавать аргументы в произвольном порядке после соответствующего ключа, желательно с готовыми примерами проверки валидности простых аргументов, ну там слов или цифр  :). Пока приходится писать так: ./script.sh ARG1 ARG2 и т.д. ну а в скрипте получать так $1 $2, это не совсем удобно....
« Последнее редактирование: 23 Июля 2015, 03:48:56 от Jolly Roger »

Оффлайн accipiter

  • Новичок
  • *
  • Сообщений: 39
    • Просмотр профиля
Для этих целей есть getopts. Просто загугли по "bash getopts" - примеров куча.
Еще есть библиотека shflags - с ней можно проверять корректность аргументов (булево значение, число, строка).

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Не совсем понятно что означает «аргументы в произвольном порядке» и что мешает их проверять обычным case?
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн streyz

  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
человек хочет --foo ARG1 --bar ARG2

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
человек хочет --foo ARG1 --bar ARG2
Тогда уже --foo=ARG1, если говорить о канонической форме. Хотя как для меня
Код: (bash) [Выделить]
export foo=ARG1 bar=ARG2 ; ./script.shсработает ничуть не хуже. Или
Код: (bash) [Выделить]
cat ./script.sh

export $*

или

for i in "$@"
do
    declare -x $i
done

./script.sh foo=ARG1 bar=ARG2
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
#!/bin/bash
for x in "$@"
do
case $x in
--*)
a=$x
continue
;;
esac
echo "$a=$x" | sed 's/--//g'
a=
done

тест
L~$
L~$ ./case.sh --foo ARG1 --bar ARG2 --aaaa 12345 --ii123 12345678
foo=ARG1
bar=ARG2
aaaa=12345
ii123=12345678
L~$

« Последнее редактирование: 23 Июля 2015, 15:10:25 от victor00000 »
Wars ~.o

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
victor00000,printf '%s=%s\n' $* | tr -d -
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Azure,
забыл.
Wars ~.o

Оффлайн streyz

  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
Вы не забывайте, что переменные еще надо как-то использовать впоследствии.

http://stackoverflow.com/questions/192249/how-do-i-parse-command-line-arguments-in-bash


p/s Подскажите что за магия во втором примере:

SEARCHPATH="${i#*=}"
« Последнее редактирование: 23 Июля 2015, 21:45:45 от streyz »

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
streyz,
ты можешь самостоятельно примерно?
Wars ~.o

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
В Linux можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Jolly Roger

  • Автор темы
  • Новичок
  • *
  • Сообщений: 20
    • Просмотр профиля
Спасибо за дельные советы.

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.