我正在寻找一种为这个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
我只是在寻找一种优雅/更好的方法来创建命令行中的切换。打印或执行。
答案 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。