gpt4 book ai didi

Bash 将 $* 或 $@ 扩展为一个函数

转载 作者:行者123 更新时间:2023-11-29 09:27:40 25 4
gpt4 key购买 nike

我通常不问问题和帮助别人,但是我写了一个相对较大的 bash 脚本 @ 目前大约有 1700 行。我利用多种函数使用“$*”将数据从一个函数推送到另一个函数。整个脚本会等待,直到在脚本末尾的 case 语句中处理“$1”:

case "$1" in
-s|--scan) VersionDump "$@"; DumpArray "$*"; exit 0;;
-t|--test) VersionDump "$@"; Virtual "$*"; exit 0;;
-e|--erase) VersionDump "$@"; Clear "$*"; exit 0;;
-l|--load) Loadit "$*"; exit 0;;
-i|--info) ThumbInfo "$*"; exit 0;;
-h|--help|-\?) Help "$2"; exit 0;;
-v|--version) VersionDump "$@"; exit 0;;
*) Help; exit 0;;
esac

我想最好了解我们是什么dealing同,我的论坛上有更多信息。我试图让“$*”和“$@”返回到一个数组,但每次都失败。我在每个函数上都写了“调试”代码,所以如果在命令行中检测到单词“调试”,我可以分析命令从一个函数传递到另一个函数:

# Optional switch - useful for me and the end user.
DEBUG=$(echo "$*" | grep -i "debug")
if [[ "$DEBUG" ]]; then
Center "${txtred}DEBUG INFORMATION"
printf "DEBUGGING Function:\t%s\n" "$FUNCNAME"
printf "PASSED TO FUNCTION *:\t%s\n" "${@}"
echo -e "1:$1 2:$2 3:$3 4:$4 5:$5 6:$6 7:$7 8:$8"
echo -en "Caller [LINE] / APP: "
caller
FullBar
echo -en "${txtrst}"
fi

我完全重写了整个脚本以删除依赖项。是的,我知道我没有提供整段代码。我确定会有问题。整个脚本已经ShellChecked和 0 个错误,是的,有一些错误,例如我不再使用的变量等。我认为没有任何威慑力。

事情并不总是像看起来那样(命令已通过):

./ultimate-edition-thumbos_1.1.4_all/bin/thumbos --load ../wip/ultimate-edition-5.0-x64-lite-xfce.iso sdg debug

结果:

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ DEBUG INFORMATION ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
DEBUGGING Function: Loadit
PASSED TO FUNCTION *: --load ../wip/ultimate-edition-5.0-x64-lite-xfce.iso sdg debug
1:--load ../wip/ultimate-edition-5.0-x64-lite-xfce.iso sdg debug 2: 3: 4: 5: 6: 7: 8:
Caller [LINE] / APP: 1688 ./ultimate-edition-thumbos_1.1.4_all/bin/thumbos
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

我的 2 美元在哪里?我做错了什么吗?

最佳答案

"$*" 扩展为单个单词。

您不能在需要将参数作为单个单词的任何地方使用它。这就是 "$@" 的用途。

调试输出表明(直接和间接)您将参数作为 "$*" 而不是 "$@"传递给 Loadit 函数

其中,从前面的片段 -l|--load) Loadit "$*"; 可以看出exit 0;; 你做到了。

不要那样做。使用 Loadit "$@"

根据经验,"$@" 几乎总是您想要的(除非您需要一个单词)。


仅供引用,我上面评论的“间接”部分是 printf 在参数不适合时重复参数的格式字符串。

所以你得到

$ printf '%s %s %s\n' foo bar baz
foo bar baz

但是

$ printf '%s\n' foo bar baz
foo
bar
baz

因此,当您的调试输出仅包含一个单个 PASSED TO FUNCTION *:\t%s\n 行时,它告诉您它只看到一个参数。

关于Bash 将 $* 或 $@ 扩展为一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36322818/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com