如何创建打印语句的选项与在shell脚本中执行它们

时间:2011-08-31 03:11:57

标签: bash shell unix

我正在寻找一种为这个bash脚本创建一个开关的方法,这样我就可以选择将它打印(echo)到stdout或执行命令以进行调试。正如您在下面所看到的,我只是通过在另一个语句中注释掉一个语句来实现此目的。

代码:

#!/usr/local/bin/bash

if [ $# != 2 ]; then
    echo "Usage: testcurl.sh <localfile> <projectname>" >&2
    echo "sample:testcurl.sh /share1/data/20110818.dat projectZ" >&2
    exit 1
fi

echo /usr/bin/curl -c $PROXY --certkey $CERT --header "Test:'${AUTH}'" -T $localfile $fsProxyURL
    #/usr/bin/curl -c $PROXY --certkey $CERT --header "Test:'${AUTH}'" -T $localfile $fsProxyURL

我只是在寻找一种优雅/更好的方法来创建命令行中的切换。打印或执行。

5 个答案:

答案 0 :(得分:2)

一个可能的技巧,虽然它只适用于简单的命令(例如,没有管道或重定向(a))是使用前缀变量,如:

pax> cat qq.sh
${PAXPREFIX} ls /tmp
${PAXPREFIX} printf "%05d\n" 72
${PAXPREFIX} echo 3

这样做的目的是在命令之前插入特定变量(在这种情况下为PAXPREFIX)。如果变量为空,则不会影响命令,如下所示:

pax> ./qq.sh
my_porn.gz  copy_of_the_internet.gz
00072
3

但是,如果将其设置为echo,则会在每行前面加上echo字符串。

pax> PAXPREFIX=echo ./qq.sh
ls /tmp
printf %05d\n 72
echo 3

(a)如果你有类似的东西,可以看到它只适用于简单命令的原因:

${PAXPREFIX} ls -1 | tr '[a-z]' '[A-Z]'

PAXPREFIX为空时,它只会以大写字母为您提供文件名列表。如果设置为echo,则会产生:

echo ls -1 | tr '[a-z]' '[A-Z]'

,并提供:

LS -1

(不是你期望的那样)。

事实上,即使是上面的简单案例,您也可以看到问题,其中%05d\n不再被引号括起来。

如果您想要更强大的解决方案,我会选择:

if [[ ${PAXDEBUG:-0} -eq 1 ]] ; then
    echo /usr/bin/curl -c $PROXY --certkey $CERT --header ...
else
         /usr/bin/curl -c $PROXY --certkey $CERT --header ...
fi

并使用PAXDEBUG=1 myscript.sh在调试模式下运行它。这与您现在的相似,但其优点是您无需编辑文件即可在正常模式和调试模式之间切换。


为了调试shell本身的输出,你可以使用bash -x运行它,或者在你的脚本中放置set -x以在特定点打开它(当然,转动它关闭set +x)。

答案 1 :(得分:2)

#!/usr/local/bin/bash

if [[ "$1" == "--dryrun" ]]; then
    echoquoted() {
        printf "%q " "$@"
        echo
    }
    maybeecho=echoquoted
    shift
else
    maybeecho=""
fi

if [ $# != 2 ]; then
    echo "Usage: testcurl.sh <localfile> <projectname>" >&2
    echo "sample:testcurl.sh /share1/data/20110818.dat projectZ" >&2
    exit 1
fi

$maybeecho /usr/bin/curl "$1" -o "$2"

答案 2 :(得分:1)

尝试这样的事情:

show=echo
$show /usr/bin/curl ...

然后相应地设置/取消设置$ show。

答案 3 :(得分:0)

这并不直接回答您的具体问题,但我想您正在尝试查看执行调试的命令。如果将#!/usr/local/bin/bash替换为#!/usr/local/bin/bash -x bash将运行并回显脚本中的命令。

答案 4 :(得分:0)

我不知道“打印与执行”的方法,但我知道“打印和执行”的方法,它使用“bash -x”。例如,请参阅this link