从命令行调用函数并将变量传递给该函数

从命令行调用函数并将变量传递给该函数

我是 Bash 脚本的新手。我想创建一个脚本,在其中使用变量执行特定函数。

例如

#!/bin/bash

fun1(){
echo "Hello $name"
}
fun2(){
echo "Bye $name"
}

我怎样才能执行它bash myscript.sh --fun1 --name xyz

答案1

不需要命令行解析工具,您可以自己解析:这并不复杂,您将学到很多东西。

命令的参数是 $1、$2、...$# 是参数的数量。shift移动所有参数:$1 的内容被删除,然后将 $2 放入 $1 中,将 $3 放入 $2 中,等等...

#!/bin/bash

fun1(){
echo "Hello $name"
}
fun2(){
echo "Bye $name"
}

while [ $# -gt 0 ] ; do
    case $1 in
       '--fun1') fun2exec="fun1" ;;
       '--fun2') fun2exec="fun2" ;;
       '--name') name="$2" ; shift ;;
       *) echo "argument error"; exit 1 ;;
    esac
    shift
done

if [ -z "$fun2exec" ] ; then
    echo "unspecified function"
    exit 2
fi
if [ -z "$name" ] ; then
    echo "unspecified name"
    exit 3
fi

$fun2exec

exit 0
    

答案2

首先,你需要将长选项转换为短选项如何在 bash-getopts 内置函数中使用长选项。然后评估调用函数和传递变量的简短选项:

#!/bin/bash

fun1(){
echo "Hello $name"
}
fun2(){
echo "Bye $name"
}

for arg in "$@"; do
  shift
  case "$arg" in
  '--fun1')   set -- "$@" '-f'   ;;
  '--fun2')   set -- "$@" '-g'   ;;
  '--name')   set -- "$@" '-n'   ;;
  *)          set -- "$@" "$arg" ;;
  esac
done

exec_fun1=false
exec_fun2=false
while getopts "n:fg" opt ; do
  case "$opt" in
  n) name=${OPTARG} ;;
  f) exec_fun1=true ;;
  g) exec_fun2=true ;;
  esac
done

if $exec_fun1; then fun1 $name ; fi
if $exec_fun2; then fun2 $name ; fi

如果你的脚本中有很多函数,那么这种方法就不太方便了。那么让它可调用会更容易,如下所示

bash myscript.sh --fun fun_name --name xyz

相关内容