我需要一个简单的busybox sh包装器,它将执行:
IF "-Q" PARAMETER IS PROVIDED THEN
acommand ALL PARAMETERS BUT "-Q" 2>&1 1>/dev/null
ELSE
acommand ALL PARAMETERS
FI
参数可以包含空格。
BTW我想用busybox sh运行脚本,它不支持数组。
答案 0 :(得分:2)
可以在busybox
的{{1}} shell中完成所有操作:
ash
答案 1 :(得分:0)
遗憾的是你需要在参数中处理空格,否则这可能会起作用:
#!/bin/sh
Q=0
ARGS=
while [ $# -ge 1 ]; do
case $1 in
-Q)
Q=1
;;
*)
ARGS="$ARGS $1"
;;
esac
shift
done
if [ $Q -eq 1 ] ; then
acommand $ARGS 2>&1 1>/dev/null
else
acommand $ARGS
fi
编辑:
所以这个版本处理空格,代价是解释倒退。
#!/bin/busybox ash
Q=0
ARGS=
while [ $# -ge 1 ]; do
case $1 in
-Q)
Q=1
;;
*)
ARGS="$ARGS \"$1\""
;;
esac
shift
done
if [ "$Q" -eq 1 ] ; then
eval acommand $ARGS 2>&1 1>/dev/null
else
eval acommand $ARGS
fi
我认为要有一个完整的解决方案,你将不得不用C编写它,这将有点难看。
答案 2 :(得分:0)
这使用bash arrays - 但我从评论中看到另一个答案,该代码不应该在bash下运行(尽管bash标签最初应用于该问题);它意味着在busybox shell下运行。
我几乎可以肯定它没有回答这个问题,因为考虑到busybox的限制,这个问题基本上无法解决。在过去,我使用了一个名为'escape'的自定义程序来构建一个参数字符串,可以通过eval来获取原始参数 - 空格和所有。但这需要来自shell之外的支持。
此解决方案仅使用'bash'。我不确定它是完全惯用的bash代码,但它确实有用。
#!/bin/bash
i=0
Qflag=0
for arg in "$@"
do
if [ "X$arg" = "X-Q" ]
then Qflag=1
else args[$((i++))]=$arg
fi
done
if [ $Qflag = 1 ]
then exec acommand "${args[@]}" 2>&1 >/dev/null
else exec acommand "${args[@]}"
fi
第一个循环使用脚本的参数构建一个数组args,除了它不会在列表中添加'-Q'并将其存在于变量Qflag中。
最后的if语句指出Qflag是否设置为1,如果是,则将错误从'acommand'发送到标准输出并将常规标准输出发送到/ dev / null(这与效果不同,如果I / O重定向相反 - 将标准输出发送到/ dev / null并将标准错误发送到同一位置,强制“acommand”上的静音。)
使用'exec'是一项简单的优化,可以简化退出状态处理。
使用'acommand'测试,在不同的行上打印其参数:
#!/bin/sh
for arg in "$@"
do echo "$arg"
done
并使用命令行,例如:
bash wrapper.sh -c -d 'arg with spaces'
产生输出:
-c
-d
arg with spaces
显然,在I / O重定向到位的情况下,没有输出:
bash wrapper.sh -c -Q -d 'arg with spaces'
但是,如果省略I / O重定向,则会看到相同的输出。