![使用外壳检查](https://linux22.com/image/131416/%E4%BD%BF%E7%94%A8%E5%A4%96%E5%A3%B3%E6%A3%80%E6%9F%A5.png)
我正在开始/尝试学习一些 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 =
答案1
您正在运行addition_example
不带参数的函数。因此,$1
和$2
变量为空,而您实际执行的只是result = $((+))
.这正是您提到的错误:
$ result = $((+))
bash: +: syntax error: operand expected (error token is "+")
当您运行时source script_name.sh 20 20
,shell 将 source script_name.sh
,并将其20
作为20
参数传递。然而,script_name.sh
实际上并不包含任何命令,它只有一个函数声明。因此,这些论点被忽略。然后,在后续命令中,您运行addition_example
但不带参数,因此您会收到上述错误。
另外,你有一个语法错误。=
在 shell 脚本中,赋值运算符 ( ) 周围不能有空格。您应该将脚本更改为:
function addition_example(){
result=$(($1+$2))
echo "Addition of the supplied arguments = $result"
}
然后使用所需的参数运行该函数:
$ source script_name.sh; addition_example 20 20
Addition of the supplied arguments = 40
答案2
您的代码有一些小问题。
尝试这个:
#!/bin/bash
function addition_example(){
local num1=$1
local num2=$2
local result=$((num1+num2))
echo "Addition of the supplied arguments = $result"
}
addition_example "$1" "$2"
- 该函数已在脚本中声明,但当您只是执行脚本时,它不会执行该函数。
- 除非指定,否则传递给脚本的参数(作为位置参数)不会传递给函数。
=
在 bash 中,变量赋值周围不能有空格- 你的
echo
语句应该被引用,任何变量都应该被引用。
答案3
该脚本存在几个问题。
使用外壳检查
有些可以通过使用来检测shellcheck.net。它显示的第一个问题是:
In dd line 4:
result = $(($1+$2))
^-- SC1068: Don't put spaces around the = in assignments.
引用变量
您有一个未加引号的变量扩展。您应该引用所有变量扩展,除非您确实希望需要 glob 和 split 操作。将回显线更改为:
echo "Addition of the supplied arguments = $result"
不要同时使用函数和 ()
函数的定义可以是以下任意一行:
function add {
add () {
第二种方法更便携(可以在更多 shell 上运行)。
带参数调用函数
有两种方法可以为函数提供参数。
来源(不推荐)
您可以在当前的交互式 shell 中获取脚本:
$ source ./script_name.sh
$ addition_example 20 20
Addition of the supplied arguments = 40
请勿使用,$20
因为$
是 shell 的保留字符。它将被 shell 解析为第二个参数$2
(在当前 shell 中)并0
在其后面附加 a。
但是,这会使用脚本内部的内容更改正在运行的 shell。这不是你通常想要的东西。
此外,获取脚本不使用 shebang 行(脚本的第一行)。这将允许交互式 shell(sh、ksh、bash、zsh)中任何正在运行的 shell 实际执行代码。如果代码被编写为使用特定的 shell 进行解释和执行。
执行它
实际执行脚本(应该如此)所需的只是:
- 使脚本可执行
chmod u+x script_name.sh
- 包括一个 shebang 行(你已经有一个)
- 请调用该函数。
编辑脚本
#!/bin/bash
addition_example(){
result=$(($1+$2))
echo "Addition of the supplied arguments = $result"
}
addition_example "$@"
并将其执行为:
$ ./script_name.sh 20 20
Addition of the supplied arguments = 40
get"$@"
扩展到提供给脚本的参数列表。
提高稳健性
为了使您的脚本更加健壮,请测试函数的参数是否为空(这将打印一条错误消息):
result=$((${1:-0}+${2:-0}))