Questions tagged «array»

数组是用于在连续存储器中存储项目的最简单的数据结构

4
间接返回数组中的所有元素
Bash手册页描述了使用${!a}来返回变量名称的内容,该变量的名称是内容的名称a(间接级别)。 我想知道如何使用此方法返回数组中的所有元素,即 a=(one two three) echo ${a[*]} 退货 one two three 我想要: b=a echo ${!b[*]} 返回相同的。不幸的是,它不是,而是返回0。 更新资料 有了这些答复,我现在意识到我的示例太简单了,因为类似这样: b=("${a[@]}") 完全可以实现我所说的需求。 所以,这就是我想要做的: LIST_lys=(lys1 lys2) LIST_diaspar=(diaspar1 diaspar2) whichone=$1 # 'lys' or 'diaspar' _LIST=LIST_$whichone LIST=${!_LIST[*]} 当然,仔细阅读Bash手册页会发现这并不符合预期,因为最后一行只是返回“数组”的索引$_LIST(根本不是数组)。 在任何情况下,都应执行以下操作(如前所述): LIST=($(eval echo \${$_LIST[*]})) 或...(最终我走的路线): LIST_lys="lys1 lys2" ... LIST=(${!_LIST}) 当然,假设元素不包含空格。
10 bash  array 

6
Bash根据元素的长度对数组进行排序?
给定一个字符串数组,我想根据每个元素的长度对该数组进行排序。 例如... array=( "tiny string" "the longest string in the list" "middle string" "medium string" "also a medium string" "short string" ) 应该排序为... "the longest string in the list" "also a medium string" "medium string" "middle string" "short string" "tiny string" (此外,如果列表按字母顺序对相同长度的字符串进行排序,那将是很好的选择。在上面的示例medium string中,middle string即使它们的长度相同,也对它们进行了排序。但这不是一个“硬”的要求,如果这样会使字符串复杂化,解)。 可以就地对数组进行排序(即修改“数组”)或创建新的排序数组都可以。

2
在数组的循环中,向数组添加元素
我对bash中的for循环有问题。例如:我有一个数组("etc" "bin" "var")。我在这个数组上进行迭代。但是在循环中,我想将一些值附加到数组中。例如 array=("etc" "bin" "var") for i in "${array[@]}" do echo $i done 显示etc bin var(当然在单独的行上)。如果我这样追加do: array=("etc" "bin" "var") for i in "${array[@]}" do array+=("sbin") echo $i done 我想要:(etc bin var sbin当然在单独的行上)。 这是行不通的。我该怎么做?
9 bash  array  for 

4
将多个目录传递给find中的-prune选项
我find用来查找和删除备份文件,但希望从搜索中排除某些目录。备份文件名可能会终止.bck,bak,~,或backup。 只有三个要排除的目录的最小工作示例(MWE)代码是: #! /bin/bash find . -type d \( -path "./.*" -o -path "./Music" -o -path "./Documents" \) -prune -o -type f \( -name "*.bck" -o -name "*.bak" -o -name "*~" -o -name "*.backup" \) -print0 | xargs -0 --no-run-if-empty trash-put 语法\( -path "dir1" -o -path "dir2" ... -o -path …

2
Gawk:将数组传递给函数
卡在GNU awk 3.1.6中,认为我已经解决了它的数组错误,但是在600行awk程序中仍然遇到了范围问题。需要验证对awk中数组作用域的理解才能找到我的错误。 给定这个说明性的awk代码... function foo(ga) { ga[1] = "global result" } garray[1] = "global" foo(garray) print garray[1] 将打印... global result 由于数组总是通过引用传递给函数,因此所有数组始终是全局的。无法创建本地数组。它是否正确?一直无法找到明确说明这一点的文档。 由于我正在调试,并且3.1.6本身在该区域中存在已知的错误,因此我试图确定awk的错误在哪里消失并从我的那里开始。 补充:那么ga []为什么在函数内部起作用? 首先,foo(ga)实际上不需要将数组传递给函数。只需以garray[]在函数内部进行。这样做并没有可衡量的性能损失,它有助于调试和错误报告。 在使用中foo(ga),ga[]是全局数组的同义词garray[]。与其成为的本地副本garray[],不如说是一个指向garray[],而是,就像符号链接是指向文件的指针一样,因此可以使用多个名称访问同一文件(或数组)。 补充:澄清格伦·杰克曼的答案 虽然在函数外部创建的数组对于函数是全局的,可以传递给函数,也可以在函数内部引用,但是在函数内部创建的数组的确确实在函数本地,并且在函数外部不可见。修改杰克曼先生的例子说明了这一点... awk ' function bar(x,y) { split("hello world", y) print "x[1] inside: " x[1] print "y[1] inside: " y[1] } BEGIN { …
9 awk  function  array 

1
zsh中的数组和循环
我正在尝试学习中的循环和数组操作zsh。 假设我在zsh中有两个数组,它们具有相同的未知元素数,每个元素都包含路径列表,例如 LOCAL_ARRAY=($LOCAL_PATH_1 $LOCAL_PATH_2 $LOCAL_PATH_3) REMOTE_ARRAY=($REMOTE_PATH_1 $REMOTE_PATH_2 $REMOTE_PATH_3) 我想用一个公共索引同时遍历两个数组,以便可以执行以下操作: cd $LOCAL_PATH_i hg pull $REMOTE_PATH_i 在每次迭代中。如何在zsh中执行此操作? 另外,我在zsh文档中搜索了循环控制和数组,但收效甚微。有没有很好的教程介绍zsh中的循环,数组等基础知识?是否适合那些缺乏bash或shell脚本经验但具有编程背景的人?
9 zsh  array 

5
在Bash数组上使用参数替换
我有要读入Bash数组的file.txt文件。然后,我需要删除空格,双引号以及每个条目中除第一个逗号以外的所有内容。这是我走了多远: $ cat file.txt 10,this 2 0 , i s 30,"all" 40,I 50,n,e,e,d,2 60",s e,e" $ cat script.sh #!/bin/bash readarray -t ARRAY<$1 ARRAY=( "${ARRAY[@]// /}" ) ARRAY=( "${ARRAY[@]//\"/}" ) for ELEMENT in "${ARRAY[@]}";do echo "|ELEMENT|$ELEMENT|" done $ ./script.sh file.txt |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| |ELEMENT|50,n,e,e,d,2| |ELEMENT|60,se,e| 除逗号情况外,哪种效果都很好。我知道有很多方法可以给这只猫换皮,但是由于这是其中较大的脚本,所以我真的很想使用参数替换到达此处: |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| …

2
如何从多个文本源的第一行创建数组?
我有一个指向文件的路径数组,每个文件都有多行文本。我想产生一个数组,其中填充了每个处理的文件的第一行,如下所示: # this.txt first line is [Test this] # another.txt first line is [Test another] paths=( ./this/path/this.txt ./another/path/another.txt ) for i in ${paths[@]}; do read -r line < $i lines+=$line done 最多我在数组中只得到一个值。我似乎无法从for循环中获取要查找的数组。我尝试了许多变体,并且很难弄清我要去哪里。

1
通过字符串引用数组元素,并在awk中初始化数组
#!/usr/bin/env bash awk ' BEGIN { arr[A]=1; arr[B]=1; arr[C]=1; arr[E]=1; arr[J]=8; arr[Q]=10; print arr[J] }' 上面的命令输出的最新设置值arr['subscript'],在这种情况下10,它是arr[Q]之前的值,print而不是。8arr[J] 另外,就像上面的脚本一样,我不想一次为一行arr['A'], arr['B'], arr['C'] and arr['E']具有相同值的值赋值1,而是将下标数组作为参数之一传递给公共值,并将公共值作为另一个参数传递给处理函数为他们分配价值的逻辑。
8 awk  array 

4
如何在bash中移动数组值
我们要构建6个挂载点文件夹作为示例 /data/sdb /data/sdc /data/sdd /data/sde /data/sdf /data/sdg 所以我们使用数组编写了这个简单的bash脚本 folder_mount_point_list="sdb sdc sdd sde sdf sdg" folderArray=( $folder_mount_point_list ) counter=0 for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6 do folder_name=${folderArray[counter]} mkdir /data/$folder_name let counter=$counter+1 done 现在我们要更改不带计数器的代码,并让= $ counter = counter + 1 是否有可能转移每个循环数组以获得下一个数组值? 像 ${folderArray[++]}

8
按文件的基本名称对文件的路径名数组进行排序
假设我有存储在数组中的文件的路径名列表 filearray=("dir1/0010.pdf" "dir2/0003.pdf" "dir3/0040.pdf" ) 我想根据文件名的基本名称以数字顺序对数组中的元素进行排序 sortedfilearray=("dir2/0003.pdf" "dir1/0010.pdf" "dir3/0040.pdf") 我怎样才能做到这一点? 我只能对它们的基本名称部分进行排序: basenames=() for file in "${filearray[@]}" do filename=${file##*/} basenames+=(${filename%.*}) done sortedbasenamearr=($(printf '%s\n' "${basenames[@]}" | sort -n)) 我在想 创建一个关联数组,其键是基名,值是路径名,因此对路径名的访问总是通过基名完成的。 仅为基名创建另一个数组,然后将其应用于基sort名数组。 谢谢。
8 bash  filenames  sort  array 


3
将数组传递给函数的最正确方法是什么?
考虑我有一个非常大的数组$large_list,有没有办法编写一个将数组作为参数的函数?例如: echo_idx_array () { arr="$1" idx="$2" echo "${arr[$idx]}" } 做这样的事情的通常策略是什么?我试着给变量,$large_list但它是空的。 我愿意修改该函数以使其适应参数列表中的任何更改。 作为记录,我正在使用ksh88,并且正在寻找尽可能便携的答案。 编辑:到目前为止,我能想到的最好的办法是遍历数组并将每个元素作为参数发送给函数。这看起来非常丑陋且容易出错,更不用说它一定会很快达到某个极限。这是我所做的: foo () { echo $* } cmd="foo " while [[ $i -lt $MAX_ARR_SIZE ]]; do cmd="$cmd ${large_list[$i]}" ((i=i+1)) done eval $cmd 有没有更好的事情要做?
8 shell  ksh  array 

1
如何从外部ini文件向变量添加关联数组?
我正在修改一个简单的脚本以添加功能,并详细了解如何编写bash脚本。当前,该脚本使用以下函数创建关联数组: declare -A site theme add_site() { local shortcut=$1 site[$shortcut]=$2 theme[$shortcut]=$3 } add_site x1 example1.com alpha add_site x2 example2.com beta 现在,我希望它读取变量的ini文件。但是,我遇到的所有文档都说明了如何获取文件,但是仅使用单个数组作为示例。如何使用类似于以下内容的数据文件创建数组以创建关联数组: [site1] shortcut=x1 site=example1.com theme=alpha [site2] shortcut=x2 site=example2.com theme=beta
1 bash  array 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.