2

我需要列出目录的文件夹和文件的名称,但从input1直到input2(参数,用户输入)开始。

#!/bin/bash
START_INDEX=$1
END_INDEX=$2
     for $STA_INDEX in $(ls) -le $END_INDEX; do
           echo item: $STA_INDEX
     done

我们和我的同事一起想出了这个根本不是解决方案的“解决方案”!那么,任何人都可以尝试向我解释我哪里出了问题,或者给我另一种可行的解决方案。我认为这段代码会给你主要的想法。

4

3 回答 3

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) 可以避免文件名中出现空格 (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

于 2012-10-19T11:03:33.653 回答
0

如果您正在谈论的索引是ls您想要开始/结束的输出中的索引,那么很容易解决sed

ls | sed -ne "${START_INDEX},${STOP_INDEX}p"

这是如何工作的:它抑制自动输出sed,然后打印范围内的所有行<$START_INDEX,$STOP_INDEX>。您可以在手册中找到更多信息sed,搜索范围运算符。

于 2012-10-19T10:59:53.663 回答
0

像这样的东西(基本):

#! /bin/bash

for x in $*
do
  ls -l $x
done


$./args.sh dir1 dir2 ...
于 2012-10-19T11:14:36.833 回答