0

为简单起见,在我的 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

我怎样才能使这项工作?

4

3 回答 3

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存在许多安全问题并且不那么方便的方法。

于 2013-10-08T23:37:32.973 回答
0

为什么不这样做:

#!/bin/bash

test -z "$1" && exec > dev/null

如果第一个参数为空或未传递,这会将脚本的输出重定向到位桶。然后所有命令(除非重定向)将丢弃它们的输出。

于 2013-10-08T23:39:06.480 回答
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 参数还允许您在脚本的不同点轻松打开和关闭输出。

于 2013-10-08T23:56:35.827 回答