比方说,你有一个Bash别名:
alias rxvt='urxvt'
这很好。
然而:
alias rxvt='urxvt -fg '#111111' -bg '#111111''
不管用,也不管用:
alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''
那么,一旦有转义引号,如何在字符串中匹配开始和结束引号呢?
alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''
看起来很笨拙,但如果允许像这样连接它们,它将表示相同的字符串。
我并没有特别提到引用问题,因为,有时候,考虑另一种方法是合理的。
rxvt() { urxvt -fg "#${1:-000000}" -bg "#${2:-FFFFFF}"; }
你可以调用它为:
rxvt 123456 654321
这个想法是你现在可以在不考虑引号的情况下使用别名:
alias rxvt='rxvt 123456 654321'
或者,如果你出于某种原因需要在所有调用中包含#:
rxvt() { urxvt -fg "${1:-#000000}" -bg "${2:-#FFFFFF}"; }
你可以调用它为:
rxvt '#123456' '#654321'
那么,当然,别名是:
alias rxvt="rxvt '#123456' '#654321'"
(哦,我想我确实提到了引用:)
shell_escape () {
printf '%s' "'${1//\'/\'\\\'\'}'"
}
实现说明:
双引号,这样我们可以很容易地输出换行单引号,并使用${…}语法
Bash的搜索和替换如下:${varname//search/replacement}
我们用“\”代替“\”
'\ "编码单个',如下所示:
单引号结束
\'编码a '(需要反斜杠,因为我们不在引号内)
又开始了单引号
Bash自动连接字符串,中间没有空格
在每个\和`之前都有一个\,因为这是${…//…/…的转义规则。}。
string="That's "'#@$*&^`(@#'
echo "original: $string"
echo "encoded: $(shell_escape "$string")"
echo "expanded: $(bash -c "echo $(shell_escape "$string")")"
注:始终编码为单引号字符串,因为它们比双引号字符串简单得多。