linux 如何将参数传递给Bash函数

brc7rcf0  于 12个月前  发布在  Linux
关注(0)|答案(1)|浏览(133)

我有一个简单的代码,我尝试将参数传递给另一个函数并获得结果。

#!/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 "$@"

字符串
得到2222的结果。
当我在multi()中使用echo自检时

#!/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 "$@"


它打印出3333!魔法!
当我把echo $ax改为echo "HERE"时,它会打印2 2 2 2,而不会打印“HERE”:D。
我认为,multi()函数由于某种原因从argc中获取$1,当我在shell中执行文件时,而不是从f()中获取

y1aodyip

y1aodyip1#

命令替换$(...)被内部命令执行的 output 替换。return设置函数的 exit status,不输出任何东西。标准输出上的Exit status和输出无关。
在第一个例子中,在多函数中没有echo,所以$(multi...)变为空。然后RES=$(( $(multi ...) + 1))变为RES=$(( + 1))变为RES=1。所以echo $(($RES + 1))变为echo 2
在这两个例子中,arg="$@"arg设置为一个 * 单个 * 字符串,参数由空格分隔。arg不是数组,arg="1 2 3 4"。调用multi $arg[i]扩展为multi 1 2 3 4[i]并执行带有4个参数的函数multi
在第二个例子中,ax被设置为第一个参数,所以ax=1echo $ax * 输出 * 1,所以RES=$(($(multi $arg[i]) + 1))变成RES=$(($(multi 1 2 3 4[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被设置为元素的 value,而不是索引,所以${arg[i]}不起作用。
  • 另外,不要在算术表达式$((中使用$,只需使用$((RES + 1))

这些问题中有几个可以通过shellcheck来识别。请记住使用shellcheck检查脚本。此外,请考虑研究如何调试Bash脚本,特别是set -x
如何将参数传递给Bash函数
为了回答你的问题,要向Bash函数传递参数,请在函数后面添加参数。记住单词分割扩展将未加引号的变量扩展分割为白色空格上的多个参数,以及"$@"等特殊情况。

相关问题