2

Bashでは、次のような整数変数が必要です。

declare -i n_jobs

現在のバックグラウンドジョブの数を値として割り当てます。

jobs | wc -l

私がそのように割り当てる場合:

n_jobs=$(jobs | wc -l)

は作業整数のようです。例:

echo $((++n_jobs))

しかし...(上記の増分を実行せずに)印刷すると、空白が含まれていることを思い出します。

$ echo "$n_jobs"
$ <space><space><space><space><space>4

だから私はこの構成に頼ります:

n_jobs=$(( $(jobs | wc -l) ))

即時の「キャスト」をintに強制します。

コマンド置換リストの出力を取得し、それを整数として変数に割り当てるより良い方法はありますか?

4

2 に答える 2

3

本当に必要というわけではありませんが、次のようなことができます。

n_jobs=$(($n_jobs + 0))

または

n_jobs=`expr $(jobs | wc -l)`

実際には避けることをお勧めしますdeclare...それは1つのシェルにのみ存在し、Posixによって指定されていません。

シェルは部分的にマクロプロセッサであり、その標準化された形式では、すべての変数が文字列として保持されます。これは、シェルに適したジョブにとって大きなハンディキャップではありません。declare整数変数を追加すると、bashは微視的に複雑なものにのみ適したものになります。

Ruby、Python、Perl、Go、あるいはnode.jsのようなもので、これらのより複雑なことを実行します。

ちなみに、元の号は再現できませんでした。を使用するdeclare -iと、式が算術的に評価され、先頭にスペースが含まれないように見えます。

declare -i qn_jobs
qn_jobs=$(jobs | wc -l)
echo "x$qn_jobs"
# => x0
于 2013-03-24T23:43:59.950 に答える
3

まだbash固有ですが、スペースのない整数を取得するためのよりクリーンな方法は次のとおりです。

job_pids=( $(jobs -p) )
n_jobs=${#job_pids[@]}

POSIX準拠のバージョン:

n_jobs=$( jobs -p | awk '{print NR}' )

-p必須ではありませんが、実際には、フィード先のジョブごとに一意の行以外は必要ないawkため、行をできるだけ短くすることをお勧めします。)

于 2013-03-25T00:29:31.497 に答える