我有一个 bash 脚本,它ps
使用如下命令列表启动一个命令:
comando="ps -o pid,pcpu,cmd -C \"$2\""
$2 必须是以下形式的变量:command1
或command1 command2 command3 ... commandn
我如何检查此变量以避免错误?我需要一个控件(带有 if)来检查模式。
编辑:ps
可以这样调用:
ps -o pid,pcpu,cmd -C "command1 command2 ... commandn"
。如果有人将此 bash 脚本调用为script.sh -C " command1 command2"
,则 ps 命令返回“IMPROPER LIST”。我想避免该ps
错误并在启动ps
命令之前回显我的错误。
答案1
你应该避免将命令放在变量中。
如果空格让你感到困惑,你可以像这样去掉它们:
ps -o pid,pcpu,cmd -C ${2// }
这将剥夺全部但是,如果您的任何命令字符串包含空格,它将破坏它们。这将删除前导空格和尾随空格以及逗号两侧的空格:
commands=${2/# } # leading space
commands=${command/% } # trailing space
commands=${command/, /,} # spaces after commas
commands=${command/ ,/,} # spaces before commas
ps -o pid,pcpu,cmd -C "$commands"
如果您想返回错误而不是清理并运行输入,只需执行空格删除或其他清理操作,然后检查结果是否等于输入。如果不相等,则输出错误。
答案2
它可以与 for 循环一起使用
arguments="command1 command2 command3 command4 command5"
for arg in $arguments
do
ps -o pid,pcpu,cmd -C $arg
done
结果:
ps -o pid,pcpu,cmd -C command1
ps -o pid,pcpu,cmd -C command2
ps -o pid,pcpu,cmd -C command3
ps -o pid,pcpu,cmd -C command4
ps -o pid,pcpu,cmd -C command5
也许您能否给出一个更好的真实例子来说明它应该如何工作,您期待什么......对我来说它看起来不太清楚。
要按照我在注释中解释的方式从命令行调用它,只需用来$*
捕获传递的所有参数。
for arg in $*
do
ps -o pid,pcpu,cmd -C $arg
done
然后像这样调用它:
./test.sh command1 command2 command3 command4 command5 command6
它将使用每个参数运行 ps 命令。