我尝试了无数种方法来获得我想要的东西,但似乎没有任何效果。我总是得到类似2:not found
的内容。
我想捕获一个命令的输出,然后测试它是否等于“!”,如下所示:
function test() {
local testv=$(command) 2>/dev/null
if [ $(#testv) == "!" ]; then
echo "Exclamation mark!"
else
echo "No exclamation mark."
fi
}
我应该如何重写上面的代码以避免错误test:2: = not found
?
答案 0 :(得分:3)
这应该有效:
if [ $testv = '!' ]; then
这里有几个问题:
$(...)
运行命令并替换其输出;您想要替换变量值,因此请使用$var
或${var}
。#
在那里做了什么。 ${#var}
将得到$ var的长度,但这不是你想要的。test
命令([
是其同义词)不理解==
,因此请使用=
(如果您是C程序员,那么看错误,但这是shell而不是C)。"!"
不能达到您的预期。我使用'!'
来确保感叹号不能被解释为历史选项。或者,您可以使用[[ ]]
代替[ ]
,因为它理解==
(并且语法通常更清晰):
if [[ $testv == '!' ]]; then
BTW,我相信这个脚本在zsh中运行的标签;如果没有,语法将有点不同(基本shell没有[[ ]]
,除了zsh之外的任何东西都会对$ testv的值进行不必要的解析,除非它是双引号)。如果您不确定(或希望它是可移植的),这里的版本应该适用于任何符合posix标准的shell:
if [ "$testv" = '!' ]; then
答案 1 :(得分:2)
试试这个:
local testv=$(command 2>/dev/null)
因为它是您要重定向的命令的输出。
(我不知道$(#testv)
你的意思。)