我正在使用以下表达式在我的 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
无论如何 - 我见过的唯一有用的情况eval
是getopt
输出。
答案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