使用外壳检查

使用外壳检查

我正在开始/尝试学习一些 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}))

相关内容