Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
bash脚本中的列表累积_Bash - Fatal编程技术网

bash脚本中的列表累积

bash脚本中的列表累积,bash,Bash,如何在bash中进行列表积累,在python中我可以这样做,但在bash中我无论如何都不能让它工作 from itertools import accumulate def list_accumulation(lst): output = list(accumulate(map(int,lst))) return output list_accumulation([1,2,3]) >>> [1, 3, 6] 由于bash的函数无法返回list,让我用一组空格分隔的值来

如何在bash中进行列表积累,在python中我可以这样做,但在bash中我无论如何都不能让它工作

from itertools import accumulate

def list_accumulation(lst):
  output = list(accumulate(map(int,lst)))
return output

list_accumulation([1,2,3]) >>> [1, 3, 6]

由于
bash
的函数无法返回
list
,让我用一组空格分隔的值来表示它:

#!/bin/bash

list_accumulation() {
    local lst i
    IFS=" " read -r -a lst <<< "$1"
    for (( i = 1; i < ${#lst[@]}; i++ )); do
        (( lst[i] += ${lst[i-1]} ))
    done
    echo "${lst[*]}"
}

list_accumulation "1 2 3"

正如齐奥诺所说,bash函数不能返回list。您可以使用name ref实现类似效果:

#!/usr/bin/env bash

list_accumulation(){
    declare -n list_accumulation_internal_list=$1; local i
    for (( i = 1; i < ${#list_accumulation_internal_list[@]}; i++ )); do
        (( list_accumulation_internal_list[i] += ${list_accumulation_internal_list[i-1]} ))
    done
}

list=(1 2 3)
list_accumulation list
echo "${list[@]}"
# 1 3 6
#/usr/bin/env bash
清单(){
声明-n列表\累积\内部\列表=$1;本地i
对于((i=1;i<${#列表(累积)(内部)列表[@]};i++),do
((列表\累积\内部\列表[i]+=${list\累积\内部\列表[i-1]}))
完成
}
列表=(1 2 3)
列表\累积列表
回显“${list[@]}”
# 1 3 6
一个很长的变量
list\u contraction\u internal\u list
用于避免与外部变量表的名称冲突

#!/usr/bin/env bash

list_accumulation(){
    declare -n list_accumulation_internal_list=$1; local i
    for (( i = 1; i < ${#list_accumulation_internal_list[@]}; i++ )); do
        (( list_accumulation_internal_list[i] += ${list_accumulation_internal_list[i-1]} ))
    done
}

list=(1 2 3)
list_accumulation list
echo "${list[@]}"
# 1 3 6