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には、問題を一緒に解決する2つの簡単で簡単な組み込み関数、set
およびがありますshift
。
set $list
$listの各要素をbashに割り当てます。
位置パラメータ。
shift
すべての位置パラメータの名前を$ n + 1から$ nに変更して、効果的に$ 1を削除し、すべての位置パラメータを前に「移動」します。
したがって、あなたの例では、あなたの宣言echo $i <...syntax...>
は
echo $i " " $1; shift
。
printf
しかし、個人的に私は代わりにbashを使います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
わかりやすい方法は次のとおりです。より良いアプローチは、sedの代わりにbash置換を使用することです。 bash メソッド ${!list[@]} & printf コマンドまたは ${parameter/pattern/string} 代替高度な機能をご覧ください。