2

在 Bash 中,我需要一个整数变量,如下所示:

declare -i n_jobs

以值的形式分配当前后台作业的数量:

jobs | wc -l

如果我这样分配它:

n_jobs=$(jobs | wc -l)

is 似乎是一个工作整数,例如:

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......它仅存在于一个 shell 中,并且 Posix 没有指定它。

shell 部分是一个宏处理器,在其标准化形式中,所有变量都保存为字符串。对于适合 shell 的工作来说,这并不是一个很大的障碍,并且添加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 回答