我正在开始/尝试学习一些 bash 脚本,我想知道我从终端向函数传递参数的方法有什么问题(见下文),因为我的方法似乎与互联网教程中的许多方法相似。
#!/bin/bash
function addition_example(){
result = $(($1+$2))
echo Addition of the supplied arguments = $result
}
我调用脚本如下:
source script_name.sh "20" "20"; addition_example
这将返回以下内容:
bash: +: syntax error: operand expected (error token is "+")
我也试过:
addition_example "$20" "$20"
这将返回以下内容:
bash: result: command not found
Addition of the supplied arguments =
您正在运行
addition_example
没有参数的函数。因此,$1
and$2
变量是空的,你实际执行的只是result = $((+))
. 这正是您提到的错误:当你运行
source script_name.sh 20 20
时,shell 将 sourcescript_name.sh
,传递它20
并20
作为参数。但是,script_name.sh
它实际上不包含任何命令,它只有一个函数声明。所以这些论点被忽略了。然后,在后续命令中,您运行addition_example
但没有参数,因此您会收到上述错误。此外,您还有语法错误。
=
在 shell 脚本中,赋值运算符 ( ) 周围不能有空格。您应该将脚本更改为:然后使用所需的参数运行函数:
您的代码有一些小问题。
尝试这个:
=
使用 bash 的 in 变量赋值不能有空格echo
陈述应该被引用,任何变量都应该被引用。脚本有几个问题。
使用 Shellcheck
有些可以通过使用shellcheck.net检测到。它显示的第一个问题是:
报价变量
您有一个未引用的变量扩展。您应该引用所有变量扩展,除非您真的需要 glob 和 split 操作。将回声线更改为:
不要同时使用函数和 ()
函数的定义可以是以下任一行:
第二种方法更便携(在更多的 shell 上运行)。
使用参数调用函数
有两种方法可以为函数提供参数。
来源它(不推荐)
您可以在当前的交互式 shell 中获取脚本:
不要使用
$20
,因为它$
是 shell 的保留字符。它将被 shell 解析为第二个参数$2
(在当前 shell 中)并在0
其后附加一个。但是,这会使用脚本中的内容更改正在运行的 shell。不是你通常想要的东西。
此外,获取脚本不会使用 shebang 行(脚本的第一行)。这将允许交互式 shell(sh、ksh、bash、zsh)中任何正在运行的 shell 实际执行代码。如果编写代码以使用特定的 shell 解释和执行。
执行它
实际执行脚本(应该如此)所需的只是:
chmod u+x script_name.sh
编辑脚本
并将其执行为:
"$@"
get 扩展为提供给脚本的参数列表。提高稳健性
为了使您的脚本更健壮,请测试函数的参数是否为空(这将打印一条错误消息):