包含另一个命令的单引号和双引号的命令

Modified on: Sat, 30 Jun 2018 04:46:30 +0800

我最近了解了观看,但是在使用相对复杂的命令时遇到了问题。< / p>

例如,我想要watch每三秒在zsh上运行以下命令*

`command_1 |中x的

for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done

正如您所看到的,上面的行包括单引号,双引号以及其他特殊字符。

所以我试过了:

watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"

然后我得到了:

  

找不到x中的匹配!@#$#....;完成

我尝试了其他组合而没有成功。以下是其中一次尝试:

watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"

也会导致类似的错误。

任何想法如何使这项工作?


*我也会参与处理bash

的解决方案

最佳答案

一般提示:如果您有两个嵌套级别,请避免在内部命令中使用单引号,并在外部命令周围使用单引号。

附加提示:不要使用back tics - `…` - 执行代码,而是使用$(…)。当涉及到嵌套引号时,Dollar-parentheses几乎是DWIM(“我的意思是”);反引号具有神秘的,依赖于shell的规则。

watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'

如果在单引号命令中需要单引号,则可以使用'\''。可以将这四个字符视为在单引号内引用单引号的方法,但从技术上讲,这是构造为单引号字符串的结尾,附加一个文字单引号,并启动一个新的单引号字符串(仍然附加到现在的话)。

对于更复杂的情况,要么精心计算引号,要么定义临时变量。

cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'

这个答案并非针对zsh。 Zsh没有带来任何重要的东西。您可以保存一些引用,因为不需要围绕命令替换使用双引号,有时可以使用内置函数而不是外部命令来减少引用需求,但基本问题与其他shell相同。

哦,顺便说一句,请注意watch将在sh中执行您的命令,而不是在zsh中执行。如果要在zsh中执行该命令,则需要运行

watch -n 3 -x zsh -c "$cmd"

在Debian / Ubuntu上,

export cmd
watch -n 3 'exec zsh -c "$cmd"'

(甚至更多的引用!)其他地方。

作者:,Gilles

相关问答

添加新评论