这是我按列对文件进行排序的 bash 脚本。
while getopts "123456" flag
do
sort -t: -k $flag names.txt
done
现在它完全符合我的需要,但我也需要将文件名作为参数。
现在的输入是 ./sortScrpt -2。
我需要输入看起来像 ./sortScript -2 names.txt
任何帮助都会很棒。谢谢
将您的 bash 脚本更改为:
while getopts "123456" flag
do
sort -t: -k $flag "${2}"
done
获取参数你可以使用 "${2}" 作为第二个参数
让你开始的东西:
#!/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
如果您需要多个排序参数,则可以将脚本更新为:
#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
为“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 不匹配的第一个参数。