sdb
以下列表表示和之间的标记sd$MAX
(MAX
范围可以是c
- z
)
例如:
MAX=z
list=$(eval echo sd{b..$MAX})
echo $list
字符串是:(示例)
sdb sdc sdd sde sdf sdg sdh sdi sdj sdk sdl sdm sdn sdo sdp sdq sdr sds sdt sdu sdv sdw sdx sdy sdz
我的问题是如何将列表每次循环移动到下一个字符串
例子:
for i in disk1 disk2 disk3 disk4 ..................
do
echo $i <...syntax...>
done
预期产出
disk1 sdb
disk2 sdc
disk3 sdd
disk4 sde
.
.
.
答案1
你可以使用间接直接循环数组的索引而不是其值,例如
给定
$ list=(sd{a..f})
$ echo "${list[@]}"
sda sdb sdc sdd sde sdf
然后
$ for i in "${!list[@]}"; do printf '%s %s\n' "disk${i}" "${list[$i]}"; done
disk0 sda
disk1 sdb
disk2 sdc
disk3 sdd
disk4 sde
disk5 sdf
如果您确实想按照自己的方式进行操作,那么您将需要从要循环的字符串元素中提取可用的整数索引,例如通过使用disk
参数替换删除前导字符串:
for d in disk1 disk2 disk3 disk4; do printf '%s %s\n' "$d" "${list[${d##disk}]}"; done
disk1 sdb
disk2 sdc
disk3 sdd
disk4 sde
答案2
最好使用数组变量:
#!/bin/bash
MAX=d
eval list=\( $(echo sd\{b..$MAX\})\)
eval disks=\( $(echo disk\{1..${#list[@]}\}) \)
for((i=0;i<=${#list[@]};i++));do
echo "${disks[i]} ${list[i]}"
done
执行时:
$ ./script
disk1 sdb
disk2 sdc
disk3 sdd
根据需要进行调整。
答案3
Bash 有两个简单直接的内置功能,它们一起可以解决您的问题:set
和shift
。
set $list
将把 $list 的每个元素分配给 bash 的一个
位置参数。
shift
将所有位置参数 $n+1 重命名为 $n,有效删除 $1 并将所有位置参数向前“移动”。
因此,在您的示例中,您的声明echo $i <...syntax...>
将是
echo $i " " $1; shift
.
顺便说一句,就我个人而言,我会使用 bash 来printf
代替echo
(参见其他地方echo
可能会给你带来麻烦):printf "%s %s\n" $i $1; shift
答案4
您可以为磁盘列构建一个计数器来填充列表并替换字符串以用作导出
-bash-4.4$ MAX=z
-bash-4.4$ list=$(eval echo sd{b..$MAX})
-bash-4.4$ echo $list
sdb sdc sdd sde sdf sdg sdh sdi sdj sdk sdl sdm sdn sdo sdp sdq sdr sds sdt sdu sdv sdw sdx sdy sdz
-bash-4.4$ disk=1 ; for i in $(echo $list) ; do echo $i | sed 's/sd./disk'$disk'\t &/' ; disk=$(($disk +1)) ; done
disk1 sdb
disk2 sdc
disk3 sdd
disk4 sde
disk5 sdf
disk6 sdg
disk7 sdh
disk8 sdi
disk9 sdj
disk10 sdk
disk11 sdl
disk12 sdm
disk13 sdn
disk14 sdo
disk15 sdp
disk16 sdq
disk17 sdr
disk18 sds
disk19 sdt
disk20 sdu
disk21 sdv
disk22 sdw
disk23 sdx
disk24 sdy
disk25 sdz
-bash-4.4$
请注意,这里我使用定义变量磁盘来计数 & a \t (制表)作为分隔符;如果您喜欢空间或其他东西,您可以适应您的需求。
如果您想在文件中获取此输出,请添加输出重定向&当然在脚本中您可能需要使用这样的代码(不带 ; )
disk=1
for i in $(echo $list)
do
echo $i | sed 's/sd./disk'$disk'\t &/' ; disk=$(($disk +1))
done > file
这是理解它的简单方法。更好的方法是使用 bash 替换而不是 sed 请参阅 bash 方法 ${!list[@]} & printf 命令或 ${parameter/pattern/string} 替换高级函数...