我通常不会问问题&帮助人们,但是我已经写了一个相对较大的bash脚本@目前大约1700行。我利用多种功能使用" $ *"将数据从一个功能推送到另一个功能。整个剧本蹲下来直到" $ 1"在脚本的最后一个case语句中处理:
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的内容,我的论坛上有更多信息。我试图获得" $ *"以及" $ @"在每次传递时回退到一个失败的数组。我写了#34; DEBUGGING"每个函数的代码,所以我可以分析,如果单词" debug"在命令行中检测到:
# 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美元等等在哪里?我做错了吗?
答案 0 :(得分:3)
"$*"
扩展为一个单词。
你不能在任何需要你的论点作为单个词的地方使用它。这就是"$@"
的用途。
调试输出指示(直接和间接)您将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
行时,它告诉你它只看到一个参数。