提问人:DeBug 提问时间:11/10/2023 更新时间:11/11/2023 访问量:43
如何将参数传递给 Bash 功能
How to pass an argument to Bash fucntion
问:
我有一个简单的代码,我尝试将参数传递给另一个函数并获得结果。
我跑./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 结果。
当我使用自助签入时echo
multi()
#!/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 $ax
echo "HERE"
我认为,当我在 shell 中执行文件时,出于某种原因,功能来自 argc,而不是从multi()
$1
f()
答:
命令替换为内部命令执行的输出。 设置函数的退出状态,不输出任何内容。退出状态和标准输出上的输出无关。$(...)
return
在第一个例子中,多功能中没有,所以什么都没有。然后变成 .所以变成了.echo
$(multi...)
RES=$(( $(multi ...) + 1))
RES=$(( + 1))
RES=1
echo $(($RES + 1))
echo 2
在这两个示例中,设置为单个字符串,参数以空格分隔。 不是数组和 。调用扩展为并执行具有 4 个参数的函数。arg="$@"
arg
arg
arg="1 2 3 4"
multi $arg[i]
multi 1 2 3 4[i]
multi
在第二个示例中,设置为第一个参数 so 和 outputs ,so 成为 ,so 最终输出 。ax
ax=1
echo $ax
1
RES=$(($(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 函数,请在函数后添加参数。请记住单词拆分扩展、将未加引号的变量扩展拆分为空格上的大量参数,以及像 ."$@"
评论
local arg=( "$@" )
应该可以工作!位置参数需要在数组的上下文中存储和处理How to pass an argument to Bash fucntion
难道你不想问问你的代码中发生了什么吗?set -x
set +x
PS4='${LINENO}'