我经常使用一个命令行程序,我提供的参数包含括号。为了简单起见,假设我正在写
echo 'bar(1,3)'
我想省略引号。但是,如果我这样做,我会得到syntax errror near unexpected token '('
.我猜这与子壳有关。如果这是唯一的方法,我愿意禁用它们。 (尽管如果子 shell 不在命令开头,则无法启动它,因此据我所知,它们没有理由禁止在参数中使用括号)
答案1
(
和)
是语法中的特殊标记字符,bash
用于许多运算符,包括:
(...)
子壳结构func() compound-command
函数定义$(...)
命令替换<(...)
,>(...)
过程替代((...))
算术评估结构$((...))
算术展开a=(...)
,a+=(...)
数组赋值运算符@(...)
,+(...)
,*(...)
,?(...)
glob 运算符(使用 extglob)[[ (a && b) || (c && d) ]]
对条件表达式运算符进行分组[[ ... =~ ...(...)... ]]
正则表达式运算符。
echo a=(b)
是语法错误,但不是export a=(b)
。
echo a)
(
是一个语法错误,除非上面的构造之一的前几行部分有一个空缺。
虽然可以编写一个 readline 钩子,在需要的地方添加引号(
,)
以避免语法错误,但这将需要相当大的努力,因为这意味着要对 shell 语法进行完整的解析。
当您意识到当前单词包含 shell 特有的字符时为时已晚,更好的方法可能是使用引用当前单词的快捷方式。
与zsh
(假设emacs
模式):
bindkey -s '\e#' '\C@\eb\Cx\Cx\e"'
引用Alt+#当前的单词。
或者近似bash
(也假设emacs
众数):
bind "\"\e#\": \"'\e \eb'\C-X\C-X\""
答案2
这可能是一个坏主意(请参阅评论),但我遇到了同样的问题,我通过创建一个在使用它之前更改[
为(
和]
的函数来解决它:)
echo2() {
expression=$(echo $@ | tr '[]' '()')
echo "$expression"
}
输入:
echo2 bar[1,3]
结果:
bar(1,3)
不知道[
和是不是]
经过shell特殊处理的。但如果您愿意使用它们来代替(
您)
的功能,也许这对您来说是一个解决方案。