Bash:执行并打印命令,因为我在终端中写了它

时间:2017-05-24 07:50:43

标签: bash shell echo

执行了:

cd ~ && mkdir mytmp && cd mytmp/
echo > somefile

并在bash脚本中执行此操作 mytmp / myscript.sh

#!/bin/bash
# version 1
cmd="find . -type f -printf %f\n"
$cmd

呈现想要的结果,即:

somefile
myscript.sh

请注意,出于某种原因,我不需要用引号括住%f \ n,因为如果我要在终端中编写命令,我会这么做。这样做会导致错误的结果:

#!/bin/bash
# version 2
cmd="find . -type f -printf '%f\n'"
$cmd

结果:

'somefile
''myscript.sh
'

我需要执行 $ cmd 同时打印它,因为我在终端中写了它。

echo $cmd中添加version 1可以正确执行命令,但不带引号回显命令。

echo $cmd中添加version 2使用引号回显命令,就像我想要的那样,但是命令执行的结果很糟糕。

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

我实际上已经得到了这个问题的答案,但是因为我“意外地”得到了我想要的东西并且在搜索后没有在网上找到答案,我想我还是会在这里发布。

解决方案包括version 2中的引号,并在使用 eval 执行命令时删除它们:

#!/bin/bash
cmd="find . -type f -printf '%f\n'"
eval $cmd
echo $cmd

答案 1 :(得分:0)

使用set -v

示例脚本

我使用了一些过于复杂的脚本,测试输出以便引用等等。

#! /bin/bash
set -v
myVariable='test'
# a comment
echo "$(echo "$myVariable") two" | cat -
运行脚本时输出

$ ./myscript
myVariable='test'
# a comment
echo "$(echo "$myVariable") two" | cat -
echo "$myVariable"
test two

正如我们所看到的,保留了引号,变量名和注释,但子shell中的命令将出现两次。由于你不使用任何子壳,这应该不是问题。