Как создать массив функций из командной строки в bash? - PullRequest
1 голос
/ 06 марта 2020

У меня есть функции в моем файле bash:

function fn1 {
  echo "fn1 commands"
}

function fn2 {
  echo "fn2 commands"
}

function fn3 {
  echo "fn3 commands"
}

, и у меня есть массив функций - функция bash execute в массиве:

funcs_to_test=( fn1 fn2 fn3 )

for testP in "${funcs_to_test[@]}"
do
    $testP
done

Еще один что мне нужно сделать, это выполнить функцию или функции с помощью ввода из командной строки:

bash app.sh -f fn1 fn2

Поэтому я читаю ввод следующим образом:

while [[ "$#" -gt 0 ]]; do case $1 in
  -f|--fn) fns="$2"; shift;;
  *) echo "Unknown parameter passed: $1"; exit 1;;
esac; shift; done

, и я хочу установить значение от fns до funcs_to_test, если не пусто:

if [ -z "$fns" ] then
  funcs_to_test=($fns)
fi

, но я получаю сообщение об ошибке:

syntax error near unexpected token `fi'

Как заставить выполнять эти функции из командной строки?

#!/bin/bash

function fn1 {
  echo "fn1 commands"
}

function fn2 {
  echo "fn2 commands"
}

function fn3 {
  echo "fn3 commands"
}
while [[ "$#" -gt 0 ]]; do case $1 in
  -f|--fsn) fns="$2"; shift;;
  *) echo "Unknown parameter passed: $1"; exit 1;;
esac; shift; done

funcs_to_test=( fn1 fn2 fn3 )

if [ -z "$fns" ] then
  funcs_to_test=($fns)      <--- here the problem. I do it wrong?
fi

for testP in "${funcs_to_test[@]}"
do
  $testP
done

Ответы [ 2 ]

3 голосов
/ 06 марта 2020
if [ -z "$fns" ]; then
#               ^

Добавьте точку с запятой или поставьте then в отдельной строке.

Вы можете использовать ShellCheck , чтобы перехватить много таких синтаксических ошибок.

2 голосов
/ 06 марта 2020

Вы можете использовать этот скрипт, который включает некоторые исправления синтаксиса и другие предлагаемые исправления:

function fn1 {
  echo "fn1 commands"
}

function fn2 {
  echo "fn2 commands"
}

function fn3 {
  echo "fn3 commands"
}

funcs_to_test=(fn1 fn2 fn3)

if (($# > 0)); then
   case $1 in
      -f|--fns) shift; funcs_to_test=("$@");;
      *) echo "Unknown parameter passed: $1"; exit 1;;
   esac;
fi

#declare -p funcs_to_test

for testP in "${funcs_to_test[@]}"; do
   printf '%s: ' 'executing'
   "$testP"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...