有人请帮忙解释一下这项工作如何?关于单引号它不应该解释任何东西,但它不像我期望的那样工作。我希望能够完全回复$ testvar值'" 123b"'。
a="testvar"
b="'"123b"'"
eval $a='$b'
echo $testvar
'123b'
a="testvar"
b='"123b"'
eval $a='$b'
echo $testvar
"123b"
a="testvar"
b='"123b"'
eval $a=$b
echo $testvar
123b
答案 0 :(得分:0)
猜测您希望testvar
成为<single-quote><double-quote>123b<double-quote><single-quote>
:
testvar=\'\"123b\"\'
答案 1 :(得分:0)
在C或Java中考虑这个:
char* str = "123b";
printf("%s\n", str);
String str = "123b";
System.out.println(str);
为什么在我们明确使用双引号时会写123b
?为什么不用引号写"123b"
?
答案是引号不是数据的一部分。编程语言使用引号来确定字符串的开始和停止位置,但它们不是字符串的任何部分。这对于Bash和C和Java都是如此。
就像在Java中无法区分使用"123" + "b"
和"123b"
创建的字符串一样,Bash无法告诉b='"123b"'
在其定义中使用单引号,而不是例如b=\"123b\"
。
如果给定一个变量,你想要用单引号分配它的值,你可以使用例如
printf -v testvar "'%s'" "$b"
但这只会在字符串周围添加新的文字单引号。它不会也不会关心最初引用b
的方式,因为该信息已存储。
要改为向变量添加一个转义层,以便在评估一旦它变成与输入相同的文字字符串时,您可以使用:
printf -v testvar "%q" "$b"
这将生成一个等价引用但不一定与原始定义相同的值。对于"value"
(其中包含双引号的文字),它可能会生成\"value\"
或'"value"'
或'"'value'"'
,这些都会完全评估为"value"
。