使用给定参数列出目录的名称

  • 本文关键字:数列 参数 bash shell
  • 更新时间 :
  • 英文 :


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

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

与我的同事一起,我们提出了这个"解决方案",这根本不是解决方案!因此,任何人都可以尝试向我解释我在哪里出错,或者给我另一种工作解决方案的方法。我认为这件代码将为您提供主要想法。

假设用户有望指定两个名称,并且您想列出在这两个名称之间排序的文件,此脚本将完成工作:

#!/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的输出是由于文件名中的空格(ETC)而容易出错。测试使用[[,以便您可以对字符串进行词典订购;经典[测试操作员对-lt表示法进行整数比较,并且仅支持=!=进行字符串比较。

全球的名称按顺序排序,因此第一个条件跳过了$lo条目之前出现的名称;一旦$hi太小,您就无需处理其他文件(因此中断)。否则,您打印名称。

循环写得非常紧凑;它可以用ifelifelse

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

,鉴于我对您对您稍微松散的问题的解释,这与我期望的一致。请注意,garbagerubbish都不是目录中文件的名称,但仍然有效。

如果您在谈论的索引是ls输出中的索引,您想开始/结束,那么使用sed

很容易解决。
ls | sed -ne "${START_INDEX},${STOP_INDEX}p"

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

类似的东西(基本):

#! /bin/bash
for x in $*
do
  ls -l $x
done

$./args.sh dir1 dir2 ...

相关内容

  • 没有找到相关文章