我不知道还能用什么语言来表达,所以我会尽力解释。我有一个函数
main()
{
if [[ "$1" = "-f" ]]
then
($sendFirstEmail) "$1"
elif [[ "$1" = "-s" ]]
then
($sendSecondEmail) "$1"
elif [[ "$1" = "-k" ]]
then
($sendKillEmail) "$1"
else
echo "valid input not provided"
fi
}
我这样称呼main "$1"
我需要做的是将另一个参数传递给主函数内的其他函数,该函数也接受传递给它的第一个参数。 $sendFirstEmail 等是其他函数的名称,它们也接受传递给它们的第一个参数。本质上,这就是我想要调用脚本的方式这可能吗?或者是否有更好的方法来实现我想要做的事情?./sendEmail.sh -f [email protected]
答案1
您可以将位置参数传递给它们,就像您所做的那样,main
但不能在子 shell 之外传递。
main()
{
if [[ "$1" == "-f" ]]
then
sendFirstEmail "$1"
elif [[ "$1" == "-s" ]]
then
sendSecondEmail "$1"
elif [[ "$1" == "-k" ]]
then
sendKillEmail "$1"
else
echo "valid input not provided"
fi
}
我不确定子 shell 的用途是什么,因此我已将其删除,但如果您确实出于某种原因确实需要子 shell,只需将参数放入其中即可:
( sendFirstEmail "$1" )
正如 Kusalananda 指出的,这个特定的例子更适合一个case
构造而不是一个if
(参见3.2.4.2 条件构造)
main()
{
case $1 in
-f) sendFirstEmail "$1";;
-s) sendSecondEmail "$1";;
-k) sendKillEmail "$1";;
*) echo "valid input not provided" >&2;;
esac
}
或者更好的是,getopts
main()
{
if getopts fsk opt; then
case $opt in
f) sendFirstEmail "$1";;
s) sendSecondEmail "$1";;
k) sendKillEmail "$1";;
*) echo "valid input not provided" >&2;;
esac
fi
}
如果您实际上想提供第二个参数,正如蒂姆建议的那样,您可以使用该getopts
optarg
功能:
main()
{
if getopts f:s:k: opt; then
case $opt in
f) sendFirstEmail "$OPTARG";;
s) sendSecondEmail "$OPTARG";;
k) sendKillEmail "$OPTARG";;
*) echo "valid input not provided" >&2;;
esac
fi
}
在这种情况下,你会main
像这样运行:
main -f 'option to the -f argument'
答案2
您可以将 2 个参数传递给您的 main 函数吗?
main()
{
arg1=$1
arg2=$2
if [[ "$arg1" = "-f" ]]
then
($sendFirstEmail "$arg2")
elif [[ "$arg1" = "-s" ]]
then
($sendSecondEmail "$arg2")
elif [[ "$arg1" = "-k" ]]
then
($sendKillEmail "$arg2")
else
echo "valid input not provided"
fi
}
在这种情况下,$arg2
inmain()
就成为$1
各种send*Email
命令的内部。
答案3
冒着重复别人说过的话的风险:如果,正如你所说,你将脚本调用为(例如) ,那么你必须调用./sendEmail.sh -f [email protected]
主要“1美元”“2美元”并更改
main()
如下:主要的() { 如果[[“$1”=“-f”]] 然后 发送第一封电子邮件“2美元” elif [[“$1”=“-s”]] 然后 发送第二封邮件“2美元” elif [[“$1”=“-k”]] 然后 发送删除邮件“2美元” 别的 echo“未提供有效输入” 菲 }所以第二(最外层)脚本的参数成为 的第二个参数
main()
,随后成为最内层函数的(唯一的)参数。
我已经 改为$(function_name)
function_name
因为你说那不起作用。$(function_name)