Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bashshell脚本:如何使用For循环和bc命令对文件中的值求和_Linux_Bash_Shell_Unix - Fatal编程技术网

Linux bashshell脚本:如何使用For循环和bc命令对文件中的值求和

Linux bashshell脚本:如何使用For循环和bc命令对文件中的值求和,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我目前正在尝试在我的bash脚本中编写一个函数,该函数执行以下操作:将一个文件作为参数,并计算该文件中的数字之和。我必须使用for循环和bc命令 文件中的值示例(每行中的每个值): 以下是我到目前为止的情况: function sum_values() { for line in $1; do #not sure how to sum the values using bc done } 我走对了吗?我不确定在这种情况下如何实现bc命令。虽然awk(或其他更高级别的语言:perl,

我目前正在尝试在我的bash脚本中编写一个函数,该函数执行以下操作:将一个文件作为参数,并计算该文件中的数字之和。我必须使用for循环和bc命令

文件中的值示例(每行中的每个值):

以下是我到目前为止的情况:

function sum_values() {
  for line in $1; do
  #not sure how to sum the values using bc
  done
}
我走对了吗?我不确定在这种情况下如何实现bc命令。

虽然
awk
(或其他更高级别的语言:
perl
python
,等等)更适合此任务,但您已经走上了正确的道路,可以用简单的方式完成此任务。提示:

$ x=1
$ y=$(bc <<<"$x + 1")
$ echo $y
2
$x=1
$y=$(bc虽然
awk
(或其他更高级别的语言:
perl
python
,等等)更适合此任务,但您已经走上了正确的道路,可以用简单的方式完成此任务。提示:

$ x=1
$ y=$(bc <<<"$x + 1")
$ echo $y
2
$x=1
$y=$(bc你没有走上正轨。为什么

  • 您正在将整个文件内容作为一个变量传递,该变量需要将整个文件存储在内存中。对于
    1
    2
    3
    示例来说,这不是问题,在现实生活中是不可能的
  • 您正在使用
    for in
    循环迭代文件的内容,假设您正在迭代该文件的行。这不是真的,因为将执行分词,这会使
    for in
    循环逐字迭代,而不是逐行迭代
  • 正如其他人提到的,shell不是它的合适工具。这是因为与
    awk
    相比,shell的这种处理速度非常慢。此外,shell不能执行浮点运算,这意味着您只能处理整数。请使用
    awk
正确的答案是(对于bash,出于教育目的):

你没有走上正轨,为什么

  • 您正在将整个文件内容作为一个变量传递,该变量需要将整个文件存储在内存中。对于
    1
    2
    3
    示例来说,这不是问题,在现实生活中是不可能的
  • 您正在使用
    for in
    循环迭代文件的内容,假设您正在迭代该文件的行。这不是真的,因为将执行分词,这会使
    for in
    循环逐字迭代,而不是逐行迭代
  • 正如其他人提到的,shell不是它的合适工具。这是因为与
    awk
    相比,shell的这种处理速度非常慢。此外,shell不能执行浮点运算,这意味着您只能处理整数。请使用
    awk
正确的答案是(对于bash,出于教育目的):


为了在bash中计算,我们用$(…)包围一个操作

以下是一些例子:

$(( 5 + 5 )) # 10

my_var = $((5 + 5)) # my_var is now 10

my_var = $(($my_var + 5)) # my_var is now 10
您问题的解决方案:

function sum_values() {
    sum=0
    for i in $(<$1); do
        sum=$(($sum + $i))
    done
    echo $sum
}
函数和值(){
总和=0

对于$中的i(在bash中进行数学运算,我们使用$(…)包围一个操作

以下是一些例子:

$(( 5 + 5 )) # 10

my_var = $((5 + 5)) # my_var is now 10

my_var = $(($my_var + 5)) # my_var is now 10
您问题的解决方案:

function sum_values() {
    sum=0
    for i in $(<$1); do
        sum=$(($sum + $i))
    done
    echo $sum
}
函数和值(){
总和=0

对于$(中的i,无需for循环即可轻松完成

paste -s -d+ numbers.txt | bc

不需要for循环,就可以轻松地完成

paste -s -d+ numbers.txt | bc


有关最佳做法,请参阅:逐行处理流。另外,请注意,设置任务的人指示您使用错误做法:……好吧,除非您先将面向行的内容读入数组;例如:
readarray-t value.……顺便说一句,使用
函数
关键字并不是特别好的形式--它使您的代码与
/bin/sh
的基线POSIX实现不兼容,但与更有用的Bashism不同,POSIX函数声明只是
sum_values(){
没有前面的
函数
@CharlesDuffy heh:),别忘了,大多数教授bash的老师都不会理解这个网站上一半好的bash答案……因此……请参阅最佳实践:逐行处理流。另外,请注意,无论是谁给你布置作业,都是在指示你使用坏的实践:……好吧,除非你阅读了这行内容首先进入一个数组;例如:
readarray-t values…顺便说一句,使用
function
关键字不是特别好的形式——它使您的代码与
/bin/sh
的基线POSIX实现不兼容,但与更有用的Bashism不同,POSIX函数声明这个函数只是
sum_values(){
没有前面的
函数
@CharlesDuffy-heh:),别忘了,在这个网站上教bash的大多数老师都不会理解bash的一半好答案…所以…返回
$sum
?那
sum=-1
sum=256
等呢?那真的不管用。@pesath不太确定你在说什么,但我正在从返回状态的functionValue限制为0-255。如果总和不在此范围内,则您的脚本将出现错误。@PesaThe啊,捕捉得好!我不知道。因此您可以用
echo
;-)替换
return
)。祝大家好运。返回
$sum
?如何处理
sum=-1
sum=256
等?这不会真正起作用。@Pesath不完全确定您在说什么,但我正在从函数返回sum的值。返回状态的值限制为0-255。如果sum是一个不在此范围内的数字,您的脚本将出现错误。@PesaThe啊,好主意!我不知道。所以你可以用
echo
;-)替换
return
。祝大家好运。也许要指出的是,除了简洁之外,Awk解决方案更好,因为它也可以处理浮点。非常好的点!而且我忘了OP想要使用
bc