我有以下函数,可以NUM
从一组文件的开头打印行。
命令(函数、脚本等)接受可变数量的参数,我想为“告诉我如何使用你”保留一个特殊选项,传统的选择是“help”、“-h”、“- ?”和“--帮助”。
headrc ()
{
# Prints first set of lines from named files.
# $1 NUM Number of lines to print
# $2 DIR Directory
num=$1
dir=$2
find "$dir" \( -name \*.org -o -name \*.texi \) \
| xargs head -n "$num";
}
答案1
您可以手动执行此操作,但使用getopt
会更有用。例如考虑:
#!/bin/bash
# Prints first set of lines from named files.
# $1 NUM Number of lines to print
# $2 DIR Directory
headrc() {
eval set -- $(getopt --name "${FUNCNAME[0]}" --options h --longoptions help -- "${@}")
while [[ "${1}" != "--" ]]; do
case "${1}" in
-h | --help)
printf "Usage: ${FUNCNAME[0]} [-h|--help] <args>\n"
return 1
;;
*)
printf "Unknown option: ${1}\n"
;;
esac
shift # Shift off option
done
shift # Shift off --
local -r num="${1}"
local -r dir="${2}"
find "${dir}" \( -name \*.org -o -name \*.texi \) | xargs head -n "${num}";
}
该getopt
工具采用现有参数 ( ${@}
) 和您提供的选项,并对它们重新排序,使所有选项排在前面,然后是 a --
,然后是其他所有选项。该--options
选项指定单字符选项,而--longoptions
指定“长”(多字符)选项。
例如:
$ getopt --options fh --longoptions file,help -- a b c -f d e --help g
-f --help -- 'a' 'b' 'c' 'd' 'e' 'g'
请注意,它getopt
支持带参数的选项,但由于您在这里不需要它,因此我没有介绍该工具的这方面内容。
将eval set --
参数更新为给定值,将函数视为其参数的内容重写为 的输出getopt
。
循环while
处理选项;当遇到 时,选项停止--
。如果是 see-h
或--help
,它会打印一条帮助消息并返回。每次它处理循环时,它都会用来shift
“关闭”第一个参数。
一旦找到它,它--
就会停止循环,并转移该参数。
现在你已经拥有了一切后选项,因此您可以像以前一样使用位置参数。