如何将参数传递给 Bash 功能

How to pass an argument to Bash fucntion

提问人:DeBug 提问时间:11/10/2023 更新时间:11/11/2023 访问量:43

问:

我有一个简单的代码,我尝试将参数传递给另一个函数并获得结果。 我跑./my_script.sh 1 2 3 4

#!/bin/bash
function multi {
    local ax=$1
    local result=$(($ax + $ax))
    return $result
}

function f {
    local arg="$@"
    for i in ${arg[@]}; do
        RES=$(($(multi $arg[i]) + 1))
        echo $(($RES + 1))
    done
}

f "$@"

并得到 2 2 2 2 结果。

当我使用自助签入时echomulti()

#!/bin/bash
function multi {
    local ax=$1
    echo $ax
    local result=$(($ax + $ax))
    return $result
}

function f {
    local arg="$@"
    for i in ${arg[@]}; do
        RES=$(($(multi $arg[i]) + 1))
        echo $(($RES + 1))
    done
}

f "$@"

它打印 3 3 3 3 !魔法!

当我更改为它时,打印 2 2 2 2 并且没有打印“HERE”:D。echo $axecho "HERE"

我认为,当我在 shell 中执行文件时,出于某种原因,功能来自 argc,而不是从multi()$1f()

Linux Bash Shell 适用于 Linux 的 Windows-subsystem-Shell

评论

2赞 Inian 11/10/2023
local arg=( "$@" )应该可以工作!位置参数需要在数组的上下文中存储和处理
0赞 KamilCuk 11/11/2023
How to pass an argument to Bash fucntion难道你不想问问你的代码中发生了什么吗?
0赞 shellter 11/11/2023
更好的调试可以通过 ( 禁用) 和 来实现。祝你好运。set -xset +xPS4='${LINENO}'
0赞 pjh 11/11/2023
Shellcheck 识别了代码的几个问题。它生成的报告包含指向有关问题以及如何解决这些问题的详细信息的链接。最好在所有新的和修改的 shell 代码上运行 Shellcheck

答:

2赞 KamilCuk 11/11/2023 #1

命令替换为内部命令执行的输出。 设置函数的退出状态,不输出任何内容。退出状态和标准输出上的输出无关。$(...)return

在第一个例子中,多功能中没有,所以什么都没有。然后变成 .所以变成了.echo$(multi...)RES=$(( $(multi ...) + 1))RES=$(( + 1))RES=1echo $(($RES + 1))echo 2

在这两个示例中,设置为单个字符串,参数以空格分隔。 不是数组和 。调用扩展为并执行具有 4 个参数的函数。arg="$@"argargarg="1 2 3 4"multi $arg[i]multi 1 2 3 4[i]multi

在第二个示例中,设置为第一个参数 so 和 outputs ,so 成为 ,so 最终输出 。axax=1echo $ax1RES=$(($(multi $arg[i]) + 1))RES=$(($(multi 1 2 3 4[i]) + 1))RES=$(( 1 + 1))echo $(($RES + 1))3

代码存在许多问题,例如:

  • 将参数与 连接起来,在使用的上下文中等于"$@""$*"
  • 以数组形式访问普通变量arg="$@"${arg[@]}
  • 缺少引号
  • 这很奇怪,我能猜到意图是,但是$arg[i]${arg[i]}
  • 当迭代数组设置为元素的而不是索引时,因此不起作用。for i in "${arg[@]}"i${arg[i]}
  • 另外,不要使用内部算术表达式,只是$$(($((RES + 1))

其中有几个问题可以通过 shellcheck 来识别。请记住使用 shellcheck 检查您的脚本。此外,请考虑研究如何调试 Bash 脚本,特别是 .set -x

如何将参数传递给 Bash 功能

若要回答问题,若要将参数传递给 Bash 函数,请在函数后添加参数。请记住单词拆分扩展、将未加引号的变量扩展拆分为空格上的大量参数,以及像 ."$@"