为了简单起见,我的bash脚本顶部是以下代码
#!/bin/bash
#if no arguments passed
if [ -z "$1" ]; then
DEBUG='1>/dev/null'
else
DEBUG='1>&1'
fi
然后在脚本的其余部分都是这样的调用
echo Doing something here! $DEBUG
关键是如果有人在没有参数的情况下调用脚本(./myScript.sh
),它就不会回应任何东西
但如果他们传入参数(./myScript.sh whathaveyou
),则echo
语句应该正常工作。
不幸的是,echo Doing something here! $DEBUG
被评估为
echo Doing something here! "1>&1"
而不是
echo Doing something here! 1>&1
我该如何做到这一点?
答案 0 :(得分:2)
您可以创建条件函数,而不是尝试使命令将文本数据评估为命令语法:
if [ -z "$1" ]; then
report() {
true
}
else
report() {
echo "$@"
}
fi
report "Doing something here!"
如果您想运行通用命令而不是仅仅打印东西,您可以使用
if [ -z "$1" ]; then
report() {
"$@" > /dev/null
}
else
report() {
"$@"
}
fi
report echo "Here are you files:"
report ls
要完全按照您的指定实现它,您必须使用eval
,它有许多安全问题并且不方便。
答案 1 :(得分:0)
为什么不这样做:
#!/bin/bash
test -z "$1" && exec > dev/null
如果第一个参数为空或未传递,则会将脚本的输出重定向到位桶。所有命令(除非重定向)将丢弃其输出。
答案 2 :(得分:0)
我倾向于这样做:
#!/bin/bash
# if $1 is not empty, set $enable_trace to 'true'
enable_trace=${1:+true}
function trace()
{
if [ "$enable_trace" = 'true' ]; then
echo "$@"
fi
}
trace Doing something here
介绍$ enable_trace参数还允许您在脚本中的不同位置轻松打开和关闭输出。