如何预览命令的变量替换?

如何预览命令的变量替换?
u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE

我想轻松地(例如,如果可能的话不转义)打印结果命令而不是执行它。

在默认的 Linux Shell(例如 bash)中是否有任何内置工具可以执行此类测试?

答案1

为了处理一般情况,您必须引用变量并将命令存储为数组:

$ USER='foo bar' DATABASE='baz ban'
$ command=(u2api --zuser="$USER" --outfmtput=json SQL create_database name="$DATABASE")
$ printf '%q ' "${command[@]}"; echo # To get a newline at the end
u2api --zuser=foo\ bar --outfmtput=json SQL create_database name=baz\ ban 

运行命令数组:

"${command[@]}"

echo该命令在一些非常简单的情况下有效:

echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE

这是最简单的解决方案,但只有当扩展不包含特殊字符(例如空格(具体来说,空格、制表符或换行符)或转义字符)时,才会显示正确的输出。例如:

$ USER='foo bar'
$ echo u2api --zuser="$USER" --outfmtput=json SQL create_database name=$DATABASE
u2api --zuser=foo bar --outfmtput=json SQL create_database name=

请注意用户名两边缺少引号。任何未加引号的包含空格的变量都会遇到同样的问题。

相关内容