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

时间:2016-03-31 01:56:34

标签: bash

我通常不会问问题&帮助人们,但是我已经写了一个相对较大的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美元等等在哪里?我做错了吗?

1 个答案:

答案 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行时,它告诉你它只看到一个参数。