Shell 中的 Eval 错误

Shell 中的 Eval 错误

我正在使用以下表达式在我的 shell 脚本中创建并设置一个变量。

eval "test2"="'Test Name's Test'"

但它会导致以下错误

-sh: eval: line 1: syntax error: Unterminated quoted string

我怎样才能解决这个问题。

答案1

要了解在eval执行某些字符串时实际会运行什么,请尝试echo它首先. eval-ing 就像将输出复制echo到 shell 中并运行

echo "test2"="'Test Name's Test'"
test2='Test Name's Test'

那里有三个单引号,它们永远不会运行。而且由于您不能在 Bash 单引号字符串中包含单引号(与许多其他语言不同,它甚至不支持反斜杠转义),因此如果您想这样做,就必须使用双引号eval

echo "test2"="\"Test Name's Test\""
test2="Test Name's Test"

但正如@daniel 指出的那样,这eval是不必要的。并且你不应该使用eval无论如何 - 我见过的唯一有用的情况evalgetopt输出

答案2

这里的错误信息非常清楚。未终止报价可能指的是右边的三个单引号。

答案3

首先:为什么eval?你可以说test="..."

第二:您不能将单引号放入'由单引号分隔的字符串中。您甚至不能用反斜杠将其转义。因此,要将单引号放入这样的字符串中,您必须结束单引号字符串并插入单引号(必须对其进行转义):

test2='Test Name'"'"'s Test'; echo $test2
test3='Test Name'\''s Test'; echo $test3

的问题eval是它增加了另一轮扩展,所以你必须逃避内部"

eval test2="'Test Name'\"'\"'s Test'"; echo $test2
eval test3="'Test Name'\''s Test'"; echo $test3

相关内容