这肯定很简单,但我似乎无法弄明白。当我通过变量执行相同的命令时,知道什么是错的吗?
这有效:
$ echo `git --version | cut -d' ' -f3`
1.8.4
但这不是:
$ c="git --version | cut -d' ' -f3"
$ echo `$c`
git version 1.8.4
有什么想法吗?
答案 0 :(得分:2)
您的代码:
c="git --version | cut -d' ' -f3"
echo `$c`
相当于:
git --version "|" cut -d' ' -f3
由于管道字符位于变量内部,因此它不会被评估为shell元字符,并且其效果与在命令行上使用引号或反斜杠键入它以使其转义相同。如果您使用此代码,则更容易看到:
c="echo a b c | wc -w"
echo `$c`
如上所述,答案是使用“eval”,以便shell扩展变量然后尝试将其作为shell源执行,然后将识别管道之类的元字符。
答案 1 :(得分:1)
我没有确切的理由触手可及,但是......你不能这样做。
管道和重定向似乎特别特别。
但是,eval
将完成这项工作:
$ c="git --version | cut -d' ' -f3"
$ eval "$c"
1.7.5.4