如何使用sort和getopts使用bash脚本对文件进行排序?

时间:2013-02-19 13:21:53

标签: bash shell sorting getopts

这是我的bash脚本,按列对文件进行排序。

while getopts "123456" flag

do
sort -t: -k $flag names.txt

done

现在它完全符合我的需要,但我需要将文件名作为参数。

现在的输入是./sortScrpt -2。

我需要输入看起来像./sortScript -2 names.txt

任何帮助都会很棒。感谢

4 个答案:

答案 0 :(得分:2)

将您的bash脚本更改为:

while getopts "123456" flag

do
sort -t: -k $flag "${2}"

done

获取参数可以使用“$ {2}”作为第二个参数

答案 1 :(得分:1)

让你入门的东西:

#!/bin/bash

while getopts ":2:" opt; do
  case $opt in
    2)
      echo "-2 was triggered, Parameter: $OPTARG" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

输出:

$ ./a.sh -2 names.txt
-2 was triggered, Parameter: names.txt

答案 2 :(得分:1)

如果您需要多个排序参数,则可以将脚本更新为:

#first parse -f fname    
getopts "f:" f
fname=$OPTARG

while getopts "123456" flag

do
    sort -t: -k $flag $fname
done

您可以将此脚本作为

运行
$ ./script.sh -f names.txt -2 

或多种排序

$ ./script.sh -f names.txt -2 -3 

答案 3 :(得分:0)

编辑修订了“sort-arg then file”要求+错误检查:

#!/bin/bash

sflag=""
sfile=""

while getopts "123456" flag
do
        [ -z "$sflag" ] && sflag="$flag"
done
shift $(($OPTIND - 1))
sfile="$1"

if [[ "$sflag" ]] && [[ "$sfile" ]];
then
    sort -t: -k $sflag $sfile
else
    # error - bail out
    echo "usage: $0 -[123456] file.txt" >&2
    exit 1
fi

OPTIND 由getopts设置,并指向 $#+ 1 (例如,没有额外参数)或第一个与getopts-flags不匹配的参数。< / p>