我试图解决的问题是能够迭代两个bash数组中的元素以及单个元素,这样这些元素以前不会作为变量存储;它们是当场声明的:
for e in "$(seq -f "number-%g" 0 4) $(seq -f "number-%g" 5 9) number-10" ; do echo $e; done当我执行这个任务时,我看到:
$ for e in "$(seq -f "number-%g" 0 4) $(seq -f "number-%g" 5 9) number-10" ; do echo $e; done
number-0 number-1 number-2 number-3 number-4 number-5 number-6 number-7 number-8 number-9 number-10似乎一切都在同一条线上打印出来。
我在这些页面上阅读和实验过资源:
这会将数组存储在中间变量中:
seq1="$(seq -f "number-%g" 0 4)"
seq2="$(seq -f "number-%g" 5 9)"
elem="number-10"
all=("${seq1[@]}" "${seq2[@]}" "${elem}")打印出来的结果:
$ for e in $all; do echo $e; done
number-0
number-1
number-2
number-3
number-4它似乎没有拾取第二个数组或最后一个元素。
在这里,我显式地存储两个数组,而不是用seq生成它们,但是,我是1)。不想按照“我正试图解决的问题”来存储这个问题的中间变量,和2)。我希望使用seq命令,而不是显式地声明数组。
$ seq1=("number-0" "number-1" "number-2" "number-3" "number-4")
$ seq2=("number-5" "number-6" "number-7" "number-8" "number-9")
$ all=("${seq1[@]}" "${seq2[@]}" "number-10")打印出来与“数字-10”的产量:
$ for e in "${all[@]}"; do echo $e; done
number-0
number-1
number-2
number-3
number-4
number-5
number-6
number-7
number-8
number-9
number-10我期待着能听到一些恶作剧!谢谢!
发布于 2020-07-23 18:48:17
那么,让我们来谈谈这个:
$ seq1="$(seq -f "number-%g" 0 4)"
$ seq2="$(seq -f "number-%g" 5 9)"
$ elem="number-10"
$ all=("${seq1[@]}" "${seq2[@]}" "${elem}")
$ declare -p all
declare -a all=([0]=注意declare -p --检查变量的内容非常方便。all是一个数组变量。当您作为$all取消引用时,您实际上是在执行${all[0]} --即只检索第一个元素。看到all数组只有3个元素了吗?seq1和seq2变量是not数组,它们是普通的“标量”变量。类似于上一段,您可以使用数组元素语法来引用标量变量:$ x="hello world"
$ declare -p x
declare -- x="hello world"
$ echo "$x"
hello world
$ echo "${x[0]}"
hello world
$ echo "${x[1]}"
$ echo "${x[*]}"
hello world
$ echo "${x[@]}"
hello world如果要执行外部命令并捕获输出的lines,请使用mapfile命令。您还需要使用过程替代来调用外部命令。$ unset seq1 seq2 all
$ mapfile -t seq1 < <(seq -f "number-%g" 0 4)
$ mapfile -t seq2 < <(seq -f "number-%g" 5 9)
$ all=("${seq1[@]}" "${seq2[@]}" "${elem}")
$ declare -p all
declare -a all=([0]="number-0" [1]="number-1" [2]="number-2" [3]="number-3" [4]="number-4" [5]="number-5" [6]="number-6" [7]="number-7" [8]="number-8" [9]="number-9" [10]="number-10")
$ printf "%s\n" "${all[@]}"
number-0
number-1
number-2
number-3
number-4
number-5
number-6
number-7
number-8
number-9
number-10若要在bash中不使用任何外部工具生成此序列,请使用支撑展开:$ all=( "number-"{0..10} )
$ declare -p all
declare -a all=([0]="number-0" [1]="number-1" [2]="number-2" [3]="number-3" [4]="number-4" [5]="number-5" [6]="number-6" [7]="number-7" [8]="number-8" [9]="number-9" [10]="number-10")number-0\nnumber-1\nnumber-2\nnumber-3\nnumber-4' [1]=注意D1 --检查变量的内容非常方便。D2是一个数组变量。当您作为D3取消引用时,您实际上是在执行D4 --即只检索<#>第一个元素。看到D5数组只有3个元素了吗?D6和D7变量是not数组,它们是普通的“标量”变量。类似于上一段,您可以使用数组元素语法来引用标量变量:A8如果要执行外部命令并捕获输出的lines,请使用D9命令。您还需要使用C10来调用外部命令。A11若要在bash中不使用任何外部工具生成此序列,请使用C12:A13number-5\nnumber-6\nnumber-7\nnumber-8\nnumber-9' [2]="number-10")
$ for e in $all; do echo $e; done
number-0
number-1
number-2
number-3
number-4注意D1 --检查变量的内容非常方便。
D2是一个数组变量。当您作为D3取消引用时,您实际上是在执行D4 --即只检索<#>第一个元素。
看到D5数组只有3个元素了吗?D6和D7变量是not数组,它们是普通的“标量”变量。类似于上一段,您可以使用数组元素语法来引用标量变量:
A8
如果要执行外部命令并捕获输出的<#>lines,请使用D9命令。您还需要使用C10来调用外部命令。
A11
若要在bash中不使用任何外部工具生成此序列,请使用C12:
A13
https://unix.stackexchange.com/questions/600032
复制相似问题