Bash:将命令替换的输出分配给整数变量

时间:2013-03-24 23:40:00

标签: bash

在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

有没有更好的方法来获取命令替换列表的输出并将其作为整数分配给变量?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

仍然bash - 具体,但更简洁的获取无空格整数的方法可能是:

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

符合POSIX的版本:

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

-p不是必需的,但您实际上不需要每个作业的唯一行以提供给awk,因此也可以使行尽可能简短。)