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には、問題を一緒に解決する2つの簡単で簡単な組み込み関数、setおよびがありますshift

set $list$listの各要素をbashに割り当てます。 位置パラメータ

shiftすべての位置パラメータの名前を$ n + 1から$ nに変更して、効果的に$ 1を削除し、すべての位置パラメータを前に「移動」します。

したがって、あなたの例では、あなたの宣言echo $i <...syntax...>echo $i " " $1; shift

printfしかし、個人的に私は代わりにbashを使いますechoecho問題を引き起こす可能性がある他の場所を参照してください)。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

わかりやすい方法は次のとおりです。より良いアプローチは、sedの代わりにbash置換を使用することです。 bash メソッド ${!list[@]} & printf コマンドまたは ${parameter/pattern/string} 代替高度な機能をご覧ください。

関連情報