如何调整我的 bash 函数以省略双引号?

Posted

技术标签:

【中文标题】如何调整我的 bash 函数以省略双引号?【英文标题】:How can I adjust my bash function such that I can omit the double-quotes? 【发布时间】:2021-02-25 15:04:52 【问题描述】:

一整天,我经常输入这样的内容:

git stash push -u -m "some phrase as a message"

我更愿意输入:

stpu some phrase as a message

所以在this answer 的帮助下,我在~./bashrc 中创建了一个函数:

function stpu() 
  git stash push -u -m "$@"

现在我可以输入stpu "some phrase as a message",这与我想要的非常接近。

如何调整函数以省略双引号?

我尝试了许多不同的变体(添加更多转义的双引号、添加单引号等),但都没有成功。

【问题讨论】:

如果您希望将所有参数连接到一个字符串中,您需要使用"$*" 而不是"$@"。也就是说,我强烈建议不要这样做;它会产生不必要的副作用。 顺便说一句,re: 函数语法,见wiki.bash-hackers.org/scripting/obsolete——最好只使用stpu() ,前面不带function 顺便说一句,我的回答中关于安全性和正确性的论点也是为什么运行 ssh somehost 'command to run' 比运行 ssh somehost command to run 更好。如果你不将你的参数引用到ssh,那么它对那些用于远程系统的参数的作用与"$*" 的行为相同——将它们组合成一个字符串,但仅在调用 shell 之后已经先与他们合作了。 请注意,引号仅用于批量转义单个字符;他们没有定义字符串(因为 shell 中的所有内容都已经是字符串)。 "foo bar" 等同于 \f\o\o\ \b\a\r,引号中的每个字符都被视为反斜杠转义。由于这些字符中的大多数对 shell 没有特殊含义(\f 只是 f 等),因此它也等同于 foo\ bar,因为 shell 只会使用空格来解析序列作为两个单词,而不是包含空格的单个单词。 【参考方案1】:

如果您使用"$*" 而不是"$@",您可以有时省略引号

这会将所有参数连接成一个字符串,用空格分隔(默认情况下;IFS 中的第一个字符,如果它已被覆盖)。 -m 期望后面跟着一个字符串(而不是每个单词一个单独的参数),所以这正是它想要的。


这不可靠,最好只使用引号。

安全

如果您想使用提交消息作为示例:Make $(rm -rf ~) safe in an argument name 进行安全修复。如果此字符串未加引号(或双引号),则在您的函数启动之前执行该命令(这是有道理的:在知道其参数列表之前不能调用函数),因此您的函数无能为力修理它。在这种情况下,使用单引号来防止发生命令替换是正确且安全的做法。

(要单引号包含单引号的字符串,请考虑使用ANSI C-like strings:$'I\'m a single-quoted string that contains a single quote'

正确性

或者,作为另一个示例:Process only files matching *.csv - 如果未引用,*.csv 可以替换为您运行命令的目录中存在的 CSV 文件列表。同样,这发生在您的函数启动之前,因此函数内部没有任何东西可以阻止它。

【讨论】:

哇,好点。我很高兴我问了。当我被允许时,我会接受答案。谢谢。

以上是关于如何调整我的 bash 函数以省略双引号?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 jq 输出中的双引号以在 bash 中解析 json 文件?

在osx bash中转义多层级联单引号和双引号

如何删除多余的双引号,而不是使用bash脚本在一行文本中打开和关闭双引号

如何在 Bash 中转义双引号? [复制]

带有单引号和双引号的 bash 别名命令

Bash——反引号内的双引号