bash + 如何切换到列表中的下一个字符串

bash + 如何切换到列表中的下一个字符串

sdb以下列表表示和之间的标记sd$MAXMAX范围可以是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 有两个简单直接的内置功能,它们一起可以解决您的问题:setshift

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} 替换高级函数...

相关内容