我需要列出目录的文件夹和文件的名称,但是从input1
开始直到input2
(参数,用户的输入)。
#!/bin/bash
START_INDEX=$1
END_INDEX=$2
for $STA_INDEX in $(ls) -le $END_INDEX; do
echo item: $STA_INDEX
done
我和我的同事一起提出了这个“解决方案”,这根本不是解决方案! 所以,任何人都可以尝试向我解释我在哪里出错,或者给我一个工作解决方案的另一种方法。我认为这段代码会给你一个主要的想法。
答案 0 :(得分:1)
假设用户需要指定两个名称,并且您希望列出在这两个名称之间排序的文件,则此脚本将完成此任务:
#!/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)可以避免文件名中的空格(等)出现问题。由于文件名中的空格(等),解析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
都不是目录中文件的名称,但它仍然有效。
答案 1 :(得分:0)
如果您正在谈论的索引是ls
输出中的索引,您想要开始/结束,那么使用sed
很容易解决:
ls | sed -ne "${START_INDEX},${STOP_INDEX}p"
如何工作:它抑制sed
的自动输出,然后打印范围为<$START_INDEX,$STOP_INDEX>
的所有行。您可以在sed
手册中找到更多信息,搜索范围操作符。
答案 2 :(得分:0)
像这样的东西(基本):
#! /bin/bash
for x in $*
do
ls -l $x
done
$./args.sh dir1 dir2 ...