在Bash脚本中回显变量时如何转义特殊字符?

在Bash脚本中回显变量时如何转义特殊字符?,bash,special-characters,Bash,Special Characters,伙计们 我应该如何处理以下字符串中的特殊字符转义: ^VfAro@khm=Y)@5,^AyxPO[[$2jW#+Vg;Paj2ycIj8VUr5z1,}qR~JnK7r_0@$ov 我在一个变量中使用这个字符串,该变量通过管道传输到Bash脚本中的cryptsetup luksOpen: echo "${string}" | cryptsetup luksOpen UUID={...} 但是在执行脚本时,我去掉了一些角色。回显普通字符串时,所有字符都将保留 我尝试过使用不同的封闭变量以及pr

伙计们

我应该如何处理以下字符串中的特殊字符转义:

^VfAro@khm=Y)@5,^AyxPO[[$2jW#+Vg;Paj2ycIj8VUr5z1,}qR~JnK7r_0@$ov
我在一个变量中使用这个字符串,该变量通过管道传输到Bash脚本中的
cryptsetup luksOpen

echo "${string}" | cryptsetup luksOpen UUID={...}
但是在执行脚本时,我去掉了一些角色。回显普通字符串时,所有字符都将保留

我尝试过使用不同的封闭变量以及printf“%q”,但没有任何可行的结果

如果您确实希望
cryptsetup
的输入上有一个尾随的换行符: 如果您不需要尾随换行符: 在这两种情况下,当我们关心字节对字节的完美输出时,我们不使用
echo
。如果您确实希望在
cryptsetup
的输入上有一个尾随的换行符: 如果您不需要尾随换行符:
在这两种情况下,当我们关心字节对字节的完美输出时,我们不使用
echo
。我怀疑您使用的是
string=”^VfAro@khm=Y)@5,^AyxPO[$2jW#+Vg;Paj2ycIj8VUr5z1,}qR~JnK7r_0@$ov“
。如果是这样,您可以使用单引号代替双引号作为
string=^VfAro@khm=Y)@5,^AyxPO[[2jW#+Vg;Paj2ycIj8VUr5z1,}qR~JnK7r_0@$ov'
printf'%s\n'
。仅在生成预期为
eval
安全的代码时使用
%q
。我怀疑您使用的是
string=”^VfAro@khm=Y)@5,^AyxPO[$2jW#+Vg;Paj2ycIj8VUr5z1,}qR~JnK7r_0@$ov”
。如果是这样,您可以使用单引号而不是双引号作为
string=^VfAro@khm=Y)@5,^AyxPO[[2jW#+Vg;Paj2ycIj8VUr5z1,}qR~JnK7r_0@$ov'
printf'%s\n'
。仅在生成与
%q
安全相关的代码时使用
%q
。如果OP在表达式中有一个单引号,…这仍然可以在没有反斜杠转义的情况下工作?!在单引号内,除了另一个单引号外的所有内容都是is literal(意思是,精确计算自身)。请注意,这里解决了两个独立的问题:正确设置变量(如上所述,单引号通常最简单,但它取决于字符串中的特殊字符),以及正确打印变量(
printf
在这里几乎总是正确的答案)..如果OP在表达式中有一个单引号,…这在没有反斜杠转义的情况下仍然有效?!在单引号中,除另一个单引号外的所有内容都是文字(意思是,精确计算自身)。请注意,这里解决了两个独立的问题,正确设置了变量(如上所述,单引号通常最简单,但这取决于字符串中的特殊字符),正确打印变量(
printf
在这里几乎总是正确的答案)。
s='^VfAro@khm=Y)@5,^AyxPO[[$2jW#+Vg;Paj2ycIj8VUr5z1,}qR~JnK7r_0@$ov'
printf '%s\n' "$s" | cryptsetup luksOpen
s='^VfAro@khm=Y)@5,^AyxPO[[$2jW#+Vg;Paj2ycIj8VUr5z1,}qR~JnK7r_0@$ov'
printf '%s' "$s" | cryptsetup luksOpen