如果我需要将命令行参数从 bash 脚本传递到命令而不进行更改,这是我的脚本:
args=("$@")
mycommand "${args[@]}"
如果我需要将 bash 脚本中的命令行参数分成两组,例如两个命令,
$ myscript -s "-o pid,tname,time,ucmd" -g "-d, -u t -t pts/4"
这是myscript
while getopts ":s:g:" opt; do
case $opt in
s)
argss="$OPTARG"
;;
g)
argsg="$OPTARG"
;;
esac
done
ps -p $(pgrep $argsg) $argss
因此对脚本的调用实际上与以下相同:
$ ps -p $(pgrep -d, -u t -t pts/4) -o pid,tname,time,ucmd
该脚本在参数的扩展周围没有双引号,因为它依赖于这样的假设:$argsg
和中的空格$argss
完全分隔参数。正如许多人已经知道的那样,这个假设有时可能不成立:参数可能包含空格。如果只有一个命令可以传递参数,我会使用一个数组(在本文的开头)。那么有没有更好的方法将这两个命令包装在一起呢?
顺便说一句,我正在尝试包装ps
以pgrep
允许我AND 选择流程的条件。看起来没有必要写这样的脚本(似乎没有简化太多),但是我可以保存这个脚本作为我不记得时的提醒,而且我可能还有其他情况使它看起来更有必要当我没有更好的主意时。
谢谢。
答案1
经过每个人将参数作为命令行上的独立参数,并利用选项处理循环来决定应添加每个参数的数组:
#!/bin/bash
for opt; do
if [[ $opt == -s ]]; then sel=s; continue; fi
if [[ $opt == -g ]]; then sel=g; continue; fi
if [[ $sel == s ]]; then argss+=("$opt");
elif [[ $sel == g ]]; then argsg+=("$opt");
else
echo "There is an error with the value of val=$val"
exit 3
fi
done
echo pgrep "${argsg[@]}"
pgrep "${argsg[@]}"
echo ps "${argss[@]}"
ps "${argss[@]}" -p "$(pgrep "${argsg[@]}")"
像在命令行上独立为每个程序编写选项一样编写选项。
像这样执行:
myscript -s -o pid,tname,time,ucmd -g -d, -u t -t pts/4
您必须更深入地测试它,因为我刚刚测试了一些基本条件。如果 pgrep 的输出像原始命令一样为空(没有进程 IP 列表),它将失败。不知道您是否希望这种情况发生。