ユーザーが 2 つの名前を指定することが想定されており、これら 2 つの名前の間で並べ替えられるファイルを一覧表示する場合、次のスクリプトがその役割を果たします。
#!/bin/bash
case $# in
(2) : OK;;
(*) echo "Usage: $0 from to" >&2; exit 1;;
esac
lo="$1"
hi="$2"
for file in *
do [[ "$file" < "$lo" ]] && continue
[[ "$file" > "$hi" ]] && break
echo "$file"
done
使用が 2 つの引数を提供したcase
かどうかをチェックし、提供されていない場合は半有用なメッセージで救済します。$lo
私は単にそれが より低いと仮定し$hi
ます。そうでない場合は、それらを交換することが可能です。
if [[ "$1" < "$2" ]]
then lo="$1"; hi="$2"
else lo="$2"; hi="$1"
fi
(glob) を使用する*
と、ファイル名に含まれるスペース (など) の問題を回避できます。の出力を解析するとls
、ファイル名にスペース (など) が含まれているため、エラーが発生しやすくなります。テスト[[
では、文字列の辞書式順序付けを行うために使用します。古典的な[
テスト演算子は、表記法との整数比較を行い、文字列比較についてはand-lt
のみをサポートします。=
!=
グロブ内の名前はソートされているため、最初の条件は$lo
エントリの前にある名前をスキップします。$hi
が小さすぎると、他のファイルを処理する必要がなくなります (したがって中断します) 。それ以外の場合は、名前を印刷します。
ループは非常にコンパクトに書かれています。、 、およびを使用するとif
、ややコンパクトに書くことができます。elif
else
for file in *
do
if [[ "$file" < "$lo" ]]
then continue
elif [[ "$file" > "$hi" ]]
then break
else echo "$file"
fi
done
ディレクトリのリストが与えられた場合:
cmp.sh human_numbers.pl intapprox.pl lg.c lu makefile x
fibonacci.pl idsdb00216213.ec lg lg.out lu.c unget.c x.c
実行bash cmp.sh garbage rubbish
すると以下が生成されます:
human_numbers.pl
idsdb00216213.ec
intapprox.pl
lg
lg.c
lg.out
lu
lu.c
makefile
少し大雑把な質問に対する私の解釈を考えると、それは私が期待するものと一致します。garbage
ディレクトリ内のファイルの名前でもなくrubbish
、それでも機能することに注意してください。