bash错误地输出星号和引号

时间:2013-10-17 19:15:35

标签: linux bash shell terminal

所以我有这个bash函数:

function xyz(){
  echo $@
}

现在我跑

xyz whaat  "loool * hahhaa"

而不是回显whaat "loool * hahhaa"

它取代了回声:

whaat loool all default hahhaa

首先,引号被剥离了。 其次*被“全部默认”取代。这是因为当前目录有2个名为“all”和“default”的文件夹,因此它认为*指的是当前目录中的所有目录

有没有办法修改我的功能,以便输出相应地成为预期的whaat "loool * hahhaa"(包括引号和*)

我尝试${@} "$@""${@}"无效

1 个答案:

答案 0 :(得分:4)

引号真的不见了,所以不要指望任何东西把它们放回去。 Bash在解析命令行时删除了它们(在man bash中搜索“quote removal”)。

但是,echo "$@"echo "${@}"将避免全局扩展(将*替换为目录列表)。

你几乎不想要$@。最好养成写"$@"的习惯。

如果你想看一个引用版本的参数,你可以对printf进行bash扩展:

xyz() {
  printf "%q " "$@"
  printf "\n"
}