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

将Bash变量设置为输出中的最后一个数字,bash,Bash,我让bash运行另一个程序(AFNI)的命令。该命令输出两个数字,如下所示: 70.013.670712 我需要创建一个bash变量,该变量将是最后一个#的值(在本例中为13.670712)。我已经想出了如何让它只打印最后一个数字,但是我很难将它设置为一个变量。最好的方法是什么 以下是仅打印13.670712的代码: test=“$(3dBrickStat-mask../。/template/ROIs.nii-mrange 41 41-百分位70 1 70'统计数据s1_ANTS+tlrc[25

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

70.013.670712

我需要创建一个bash变量,该变量将是最后一个#的值(在本例中为13.670712)。我已经想出了如何让它只打印最后一个数字,但是我很难将它设置为一个变量。最好的方法是什么

以下是仅打印13.670712的代码:
test=“$(3dBrickStat-mask../。/template/ROIs.nii-mrange 41 41-百分位70 1 70'统计数据s1_ANTS+tlrc[25]”);echo“${test}”|awk'{print$2}'

仅将命令输出到
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
命令

只需将命令输出到
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
命令


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

$ echo "70.0 13.670712" | cut  -d ' ' -f2
13.670712
并将其分配给具有以下内容的变量:

只需将echo'70.0 13.670712'替换为实际生成这两个数字的命令即可

如果要获取某个分隔字段(或命令的分隔输出)的最后一个值,可以使用。这完全是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

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

$ echo "70.0 13.670712" | cut  -d ' ' -f2
13.670712
并将其分配给具有以下内容的变量:

只需将echo'70.0 13.670712'替换为实际生成这两个数字的命令即可

如果要获取某个分隔字段(或命令的分隔输出)的最后一个值,可以使用。这完全是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

read
解决方案非常好,而且非常地道。我不推荐
集合
一个;我想,如果要寻求可移植性,第一种可能是最好的选择(但OP指定了Bash,因此我们可以安全地使用
读取
解决方案,这将是最有效的)。@gniourfgniourf:感谢!希望提供尽可能不使用外部实用程序的方法。但我认为对于这样一个微不足道的用例,这并不重要。不推荐
set
的原因可能与字段分隔有关,确切地说是。我认为无引号的扩展是对路径名扩展的明确要求(当然还有分词);这里的用法只用于分词……在我看来,它在语义上并不正确(但我很时髦)。@gniourf_gniourf:干杯!:)
read
解决方案非常好,而且非常地道。我不推荐
集合
一个;我想,如果要寻求可移植性,第一种可能是最好的选择(但OP指定了Bash,因此我们可以安全地使用
读取
解决方案,这将是最有效的)。@gniourfgniourf:感谢!希望提供尽可能不使用外部实用程序的方法。但我认为对于这样一个微不足道的用例,这并不重要。不推荐
set
的原因可能与字段分隔有关,确切地说是。我认为无引号的扩展是对路径名扩展的明确要求(当然还有分词);这里的用法只用于分词……在我看来,它在语义上并不正确(但我很时髦)。@gniourf_gniourf:干杯!:)