如何在bash脚本中将参数传递给函数?

Mar*_*ark 6 scripting bash

我正在开始/尝试学习一些 bash 脚本,我想知道我从终端(见下文)向函数传递参数的方法有什么问题,因为我的方法似乎与互联网教程中的许多方法相似。

#!/bin/bash

function addition_example(){
    result = $(($1+$2))
    echo Addition of the supplied arguments = $result
}
Run Code Online (Sandbox Code Playgroud)

我调用脚本如下:

source script_name.sh "20" "20"; addition_example 
Run Code Online (Sandbox Code Playgroud)

这将返回以下内容:

bash: +: syntax error: operand expected (error token is "+")
Run Code Online (Sandbox Code Playgroud)

我也试过:

addition_example "$20" "$20"
Run Code Online (Sandbox Code Playgroud)

这将返回以下内容:

bash: result: command not found
Addition of the supplied arguments =
Run Code Online (Sandbox Code Playgroud)

ter*_*don 13

您正在运行addition_example没有参数的函数。因此,$1$2变量是空的,您实际执行的只是result = $((+)). 这正是您提到的错误:

$ result = $((+))
bash: +: syntax error: operand expected (error token is "+")
Run Code Online (Sandbox Code Playgroud)

当您运行source script_name.sh 20 20,shell将源script_name.sh,传递2020作为参数。然而,script_name.sh它实际上并不包含任何命令,它只有一个函数声明。所以参数被忽略。然后,在随后的命令中,您运行addition_example但没有参数,因此您会收到上述错误。

另外,您有语法错误。=在 shell 脚本中,赋值运算符 ( )周围不能有空格。您应该将脚本更改为:

function addition_example(){
    result=$(($1+$2))
    echo "Addition of the supplied arguments = $result"
}
Run Code Online (Sandbox Code Playgroud)

然后使用所需的参数运行函数:

$ source script_name.sh; addition_example 20 20
Addition of the supplied arguments = 40
Run Code Online (Sandbox Code Playgroud)

  • 另外(挑剔):`printf 'Addition ... = %d\n' "$(( $1 + $2 ))"`(`printf` 并且不需要额外的变量(如果使用,应该是`local` ))。还可以删除“function”关键字以使其可移植。 (3认同)
  • 可能还值得一提的是,使用 `"$20"` 作为参数扩展了 *caller* 的第二个参数 (`$2`) 并在末尾附加了一个 `0`。 (2认同)

jes*_*e_b 7

您的代码有一些小问题。

尝试这个:

#!/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"
Run Code Online (Sandbox Code Playgroud)
  • 该函数是在脚本中声明的,但是当您只是执行脚本时,它不会执行该函数。
  • 除非指定,否则传递给脚本的参数(作为位置参数)不会传递给函数。
  • =使用 bash的in 变量赋值周围不能有空格
  • 你的echo语句应该被引用,任何变量都应该被引用。