将Bash变量设置为输出中的最后一个数字

时间:2017-01-03 18:00:44

标签: bash

我有bash从另一个程序(AFNI)运行命令。该命令输出两个数字,如下所示:

70.0 13.670712

我需要创建一个bash变量,它将是最后一个#(在本例中为13.670712)。我已经弄清楚如何让它只打印最后一个数字,但我却无法将其设置为变量。这样做的最佳方式是什么?

以下是仅打印13.670712的代码: test="$(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]')"; echo "${test}" | awk '{print $2}'

2 个答案:

答案 0 :(得分:2)

只需pipe(|)命令输出到awk。在您的示例中,awk从您之前命令的stdout读取并打印出2nd列,该列被默认的单个空格字符限制。

test="$(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]' | awk '{print $2}')"
printf "%s\n" "$test"
13.670712

(或)使用echo

echo "$test"
13.670712

这是最简单的方法,如果您正在寻找其他方法在bash - ism中执行此操作,请使用read命令作为process-substitution

read _ va2 < <(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]')
printf "%s\n" "$val2"
13.670712

使用set的另一个更便携版本,无论可用的shell如何都可以使用。

set -- $(3dBrickStat -mask ../../template/ROIs.nii -mrange 41 41 -percentile 70 1 70 'stats.s1_ANTS+tlrc[25]');
printf "%s\n" "$2"
13.670712

答案 1 :(得分:2)

您可以使用cut进行打印以打印第二列:

$ echo "70.0 13.670712" | cut  -d ' ' -f2
13.670712

并将其分配给command substitution的变量:

$ sc="$(echo '70.0 13.670712' | cut  -d ' ' -f2)"
$ echo "$sc"
13.670712

只需用实际产生两个数字的命令替换echo '70.0 13.670712'

如果要获取某些分隔字段的最后一个值(或命令的分隔输出),可以使用parameter expansion。这完全是Bash内部的:

$ echo "$s"
$ echo ${s##*' '}
10
$ echo "$s2"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$ echo ${s2##*' '}
20

然后直接分配:

$ echo "$s2"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$ lf=${s2##*' '}
$ echo "$lf"
20