在bash脚本中传递N个文件作为参数(也在随机位置)

时间:2013-08-05 15:46:46

标签: bash command-line-arguments

我正在编写一个脚本来详细说明许多文本文件。

我需要将N个文本文件传递给我的bash脚本。

脚本调用如下:

:~$ ./bristat [-u user] [-p] [-m] file1.log...fileN.log

脚本详细说明了参数 -u -m -p 之后的日志文件。

  • args -u -m -p是可选的(我可以调用没有,任何或所有这些args的脚本);
  • file1.log...fileN.log是执行所必需的(0< files< = N)
  • logfiles 的所有后缀 .log

我的问题是:如何在命令行中识别和检查这些日志文件? 我不关心(现在)关于文件的内容和做什么,我只需要脚本识别它们,进行属性检查,然后处理它们(但是如何处理不是我在这里要求的)。 我不知道我是否清楚。要求更好的澄清。

这是我没有文件检查的代码。我需要在这里整合。

#!/bin/bash

if [ $# == 0 ]; then
    echo "No argument passed:: ERROR"
    exit 
fi

usage="Usage: bristat [-u args] [-p] [-m] logfile1...logfileN" 
params=":u:pm" 
U=0 P=0 M=0

while getopts $params OPT; do
    case $OPT in        u)
        case ${OPTARG:0:1} in
                -)
            echo "Invalid argument $OPTARG" >&2
            exit
        esac   
        echo "[-u] User = $OPTARG" >&2
        U=$((++U))
        ;;  p)
        echo "[-p] Number of lost games = " >&2
        P=$((++P))
        ;;  m)
        echo "[-m] Average of total points = " >&2
        M=$((++M))
        ;;  \?)
        echo $usage >&2
        exit
        ;;  :)
        echo "Option [-$OPTARG] requires an argument" >&2
        exit
        ;;
    esac 
done   

#check for duplicate command in option line 
if [ "$U" -gt "1" ]; then
echo "Duplicate option command line [-u]"
exit 
fi

if [ "$P" -gt "1" ]; then
echo "Duplicate option command line [-p]"
exit 
fi 

if [ "$M" -gt "1" ]; then
echo "Duplicate option command line [-m]"
exit 
fi

shift $[$OPTIND -1] # Move argument pointer to next.

为了更清楚,脚本检查日志文件以返回统计信息:

  • -u检查用户是否为授权名称
  • -m返回游戏总分的平均值
  • -p返回有关游戏的丢失匹配数

修改

如果我想以随机位置调用参数?我的意思是(即):

  

:〜$ ./bristat [-u user] [-p] [-m] file1.log file2.log file3.log

     

:〜$ ./bristat [-m] file1.log file2.log [-u user] [-p] file3.log

     

:〜$ ./bristat [-m] file1.log [-p] file2.log [-u user] file3.log

可以是相同的调用。我该如何更改我的代码?有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您希望使用shift

迭代文件名列表

获得论据后

shift $(( OPTIND-1 ))
while [ -f $1 ] 
do 
   #do whatever you want with the filename in $1.
   shift
done