如何在shell/bash/sh/中存储和打印带有特殊字符的变量

如何在shell/bash/sh/中存储和打印带有特殊字符的变量

我基本上需要多次以不同的形式加载、保存和重新加载包含程序参数的变量。

问题是这个变量不能被视为普通变量,因为它的开头包含“-”号。打印它或加载它以便可以查看它包含的内容,这使得事情变得很困难,因为\\在它可以使用或不使用之前,在开始时不断需要 a 。

一个技巧总是用 保存它 \\,但在读取它之前,我echo $it将最后一个输出读取为用例的变量。

这是非常不切实际的,所以我需要一种方法来保存变量的内容,并且永远不会干扰执行它的代码。

以下变量默认用于yadgdb,但也可以用于任何其他程序。

例如,快速测试一下是否可以在我的上下文中使用这样的变量printf 没有需要任何 printf 参数。这是因为:

gdbParameters="-ex 'set pagination off' -ex 'set environment G_MESSAGES_DEBUG = all'"
printf $gdbParameters

返回:

printf: usage: printf [-v var] format [arguments]

谢谢你们。

答案1

重点是printf,您不使用它直接打印变量,而是向其传递格式,然后将变量作为参数传递:

$ gdbParameters="-ex 'set pagination off' -ex 'set environment G_MESSAGES_DEBUG = all'"
$ printf '%s\n' "$gdbParameters"
-ex 'set pagination off' -ex 'set environment G_MESSAGES_DEBUG = all'

至于以一种永远不会干扰任何尝试使用它的代码的方式保存变量,这是不可能的。相反,您需要小心并始终编写良好、干净的代码来处理变量中的任意内容。

这就是基本的良好实践,例如始终引用变量(请参阅为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?忘记在 bash/POSIX shell 中引用变量的安全隐患--),并在调用程序并将变量作为输入传递给它时使用标准来指示选项的结束( e.g. grep -- "$variable" file)。

答案2

如果您的 shellPOSIX兼容(如果是printf内置命令)或调用 compliant printf,只需尝试:

printf -- "$var"

这告诉printf不要将以下参数解释为选项。

但总的来说,请记住,内容中的百分比或反斜杠$var可能会导致您的输出以您不期望的方式被修改。为此原因,

printf "%s" "$var"

是更好的解决方案。

相关内容