bashスクリプトのコマンドライン引数を変更せずにコマンドに渡す必要がある場合、スクリプトは次のようになります。
args=("$@")
mycommand "${args[@]}"
Bashスクリプトのコマンドライン引数を2つのグループ、つまり2つのコマンドに分割する必要がある場合は、
$ 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
。多くの人がすでに知っているように、この仮定は時々成立しないかもしれません。引数にはスペースを含めることができます。引数を渡すコマンドが1つしかない場合は、配列を使用してください(この記事の冒頭)。もしそうなら、これら2つのコマンドを一緒にまとめるより良い方法はありますか?
ところで、許可する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リストなし)、失敗します。これが起こりたいかどうかはわかりません。