次のファイルがあります。
a.10 a.15 a.20 a.30 a.40 a.50
すべての人に同じことを行うには、次のことを使用できます。
for data in `ls a*| sort -n`
同じことを一つずつやりたいなら。利用可能なもの:
data=(`ls a* | awk '{print $1}'`)
numb=`ls a*|wc|awk '{print $1}'`
ii=0
for da in ${data[$ii]} ; do
echo ${data[$ii]}
ii=$(($ii+1))
done
しかし、iiが2以上のファイルに対して同じことをどのように実行できますか?つまり、lsと同じですが、すべてのファイルが2であるわけではありません。
a.20 a.30 a.40 a.50
答え1
ls
拡張が実際にシェルによって実行されたときに出力を解析する理由はまったくありません。このコードの代わりに:
for data in `ls a*| sort -n`
以下を使用できます。
for data in a*
ソートする必要がある場合でも、以下を使用できます(ファイル名に新しい行がある場合は失敗します)。
for data in $( echo a* | sort -n )
複数の値を使用する最善の方法は、その値を配列に入れることです。
具体的には、パラメータの配列は次のとおりです。
set -- a*
printf '<%s>' "$@"; echo
そして、いくつかのタスクを1つずつ実行するコードは、次のように簡単になります。
#!/bin/bash
set -- a*
numb=$#
printf '%s ' "$@"
ファイル数に基づいて処理するには、次のようにします。
#!/bin/bash
# using bash as the [[ is more robust.
set -- a* # set an array of all files that start by a
for file # walk the array one by one
do
[[ ${file#a\.} -le 20 ]] && continue # is the file number < 20
printf '%s\n' "$file" # do additional processing here
done
答え2
以下は、要求されたパターンに一致するすべてのファイルを処理します。ただし、a.2y
数字のサフィックスだけでなく、既存のファイルとも一致します。
for file in a.2?; do
#stuff with ${file}
done
数値サフィックスを含むファイルのみを処理する場合は、次の方法を使用できます。
for file in a.2{0..9}; do
if [[ -f ${file} ]]; then # file exists
# stuff with ${file}
fi
done