假设用户应该指定两个名称,并且您想列出在这两个名称之间排序的文件,这个脚本将完成这项工作:
#!/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
检查用户是否提供了两个参数,如果没有,case
则使用半有用的消息退出。我只是假设$lo
比较低于$hi
; 如果没有,可以交换它们:
if [[ "$1" < "$2" ]]
then lo="$1"; hi="$2"
else lo="$2"; hi="$1"
fi
使用*
(glob) 可以避免文件名中出现空格 (etc) 的问题。由于文件名中的空格(等),解析 的输出ls
很容易出错。测试使用[[
以便您可以按字典顺序对字符串进行排序;经典的测试运算符使用符号[
进行整数比较,并且仅支持和字符串比较。-lt
=
!=
glob 中的名称按排序顺序排列,因此第一个条件会跳过$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