Пропустить функции в сценарии оболочки с аргументами командной строки - PullRequest
0 голосов
/ 01 июля 2019

Я написал сценарий оболочки с различными функциями, который я могу вызвать из командной строки следующим образом:

bash script.sh -i -b

Так что будут запускаться эти две функции, а не другиев сценарии.Тем не менее, я хочу изменить эту логику, так как скрипт должен запускать каждую функцию по умолчанию, если я просто делаю

bash script.sh

И если я передаю аргументы типа -i -b, я бы хотелвместо этого пропустите эти функции.Любая помощь приветствуется!

Ответы [ 2 ]

1 голос
/ 02 июля 2019

Вы можете черный список элементов из списка функций, которые вызываются по умолчанию. Что-то вроде:

#!/bin/bash

list='a b c d e f g h i'

# define some functions
for name in $list; do
        eval "func_$name() { echo func_$name called with arg \$1; }"
done

# black list items from list
for x; do
        list=$(echo "$list" | tr -d ${x#-})
done

for name in $list; do
        func_$name $name
done

Но, честно говоря, имеет смысл сделать что-то вроде:

$ cat script.sh 
#!/bin/bash

list='a b c d e f g h i'
test $# = 0 && set -- $list # set default list of functions to call

# define some function
for name in $list; do
        eval "func_$name() { echo func_$name called with arg \$1; }"
done

for name; do
        func_$name $name
done
$ bash ./script.sh 
func_a called with arg a
func_b called with arg b
func_c called with arg c
func_d called with arg d
func_e called with arg e
func_f called with arg f
func_g called with arg g
func_h called with arg h
func_i called with arg i
$ bash ./script.sh c g
func_c called with arg c
func_g called with arg g
1 голос
/ 01 июля 2019

Для реализации этих двух логик:

  1. Если аргументов нет вообще, запустите все функции
  2. Для каждого переданного аргумента пропустить выполнение некоторой функции

Вы можете сделать это так:

#!/bin/bash

function func_i {
  echo "I am i."
}

function func_b {
  echo "I am b."
}

function main {

  # Check if there are no arguments, run all functions and exit.

  if [ $# -eq 0 ]; then
    func_i
    func_b
    exit 0
  fi

  # Parse arguments -i and -b, marking them for no execution if they are passed to the script.

  proc_i=true
  proc_b=true

  while getopts "ib" OPTION; do
      case $OPTION in
      i)
          proc_i=false
          ;;
      b)
          proc_b=false
          ;;
      *)
          echo "Incorrect options provided"
          exit 1
          ;;
      esac
  done

  # Execute whatever function is marked for run.

  if $proc_i; then func_i; fi
  if $proc_b; then func_b; fi
}

main "$@"

Некоторые объяснения:

$# возвращает количество аргументов, переданных скрипту. Если $# равно 0, то в сценарий не было передано ни одного аргумента.

getops принимает переключатели -i и -b, все остальные переключатели приведут к ошибке, обработанной в случае *).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...