Parameters 使用AWK和getopts解析非POSIX命令行参数
我正在尝试编写一个Bash脚本,它可以以非POSIX的方式接受命令行参数。具体地说,我希望使用Parameters 使用AWK和getopts解析非POSIX命令行参数,parameters,awk,arguments,option,getopts,Parameters,Awk,Arguments,Option,Getopts,我正在尝试编写一个Bash脚本,它可以以非POSIX的方式接受命令行参数。具体地说,我希望使用getopts以标准方式解析命令行参数,同时使用其选项字符串构建getopts意外的命令行参数列表。下面的代码注释中显示了我描述的命令行参数解析示例。我正在寻找解决方案,但我的脚本只能识别唯一的意外参数,而我需要识别所有意外参数。我希望得到解决这个问题的指导(可能是通过巧妙的AWK脚本)。非常感谢您的帮助 #!/bin/bash #####################################
getopts
以标准方式解析命令行参数,同时使用其选项字符串构建getopts
意外的命令行参数列表。下面的代码注释中显示了我描述的命令行参数解析示例。我正在寻找解决方案,但我的脚本只能识别唯一的意外参数,而我需要识别所有意外参数。我希望得到解决这个问题的指导(可能是通过巧妙的AWK脚本)。非常感谢您的帮助
#!/bin/bash
################################################################################
#
# This is a test of command line parameter parsing that is explicitly non-POSIX.
# This approach handles
# - options (for getopts)
# - arguments of options (for getopts)
# - positional arguments (for getopts) and
# - non-option arguments (command line parameters not expected by getopts).
# All non-option arguments are placed in the string non_option_parameters. The
# silent error reporting mode of getopts is required. Following command line
# parameter parsing, input information can be accepted based on internal
# priority assumptions.
#
# example usage:
# ./script.sh
# non-option parameters:
# ./script.sh -a Dirac
# -a triggered with parameter Dirac
# non-option parameters:
# ./script.sh -a Dirac -b
# -a triggered with parameter Dirac
# -b triggered
# non-option parameters:
# ./script.sh -a Dirac Feynman -b
# -a triggered with parameter Dirac
# -b triggered
# non-option parameters: Feynman
# ./script.sh -a Dirac Feynman Born -b
# -a triggered with parameter Dirac
# -b triggered
# non-option parameters: Feynman Born
# ./script.sh -a Dirac Feynman Born Born -b
# -a triggered with parameter Dirac
# -b triggered
# non-option parameters: Feynman Born
#
# WANT:
# ./script.sh -a Dirac Feynman Born Born -b
# -a triggered with parameter Dirac
# -b triggered
# non-option parameters: Feynman Born Born
#
################################################################################
option_string=":a:b"
non_option_parameters=""
process_arguments(){
OPTIND=1
while getopts "${option_string}" option; do
case ${option} in
a)
echo "-a triggered with parameter "${OPTARG}"" >&2 # output to STDERR
;;
b)
echo "-b triggered" >&2 # output to STDERR
;;
\?)
echo "invalid option: -"${OPTARG}"" >&2 # output to STDERR
;;
esac
done
shift $(expr ${OPTIND} - 1)
echo "$@"
}
parameters="${@}"
while [ ! -z "${parameters}" ]; do
parameters="$(process_arguments ${parameters})"
TEMP=$(echo "${parameters}" | awk -F " " '{print $1}')
IS_POS="$(echo "${option_string}" | sed 's/^:-://' | sed 's/\([a-zA-Z]\)/\ \1/g' | sed 's/\([a-zA-Z]\)/-\1/g' | sed 's/://g' | awk -v OPTION=${TEMP} \
'{
for(i=1; i<=NF; i++){
if( (match($i, OPTION)== 1) && (length($i) == length(OPTION)) ){
print $i
}
}
}' \
| wc -l)"
# The AWK code is quivalent to grep -w "-OPTIONCHAR". Note the trailing '-'
# character behind OPTIONCHAR). IS_POS tells whether the first element in a
# space-delimited string of parameters is a positional argument.
[ ${IS_POS} -eq 0 ] && non_option_parameters="${non_option_parameters} ${TEMP}"
T_ARRAY=""
for parameter in ${parameters}; do
[ $IS_POS -eq 0 ] && [ "${TEMP}" == "${parameter}" ] && continue
T_ARRAY="${T_ARRAY} ${parameter}"
done
parameters="${T_ARRAY}"
done
echo "non-option parameters:${non_option_parameters}"
#/bin/bash
################################################################################
#
#这是一个显式非POSIX的命令行参数解析测试。
#这种方法处理
#-选项(用于getopts)
#-选项的参数(用于getopts)
#-位置参数(用于getopts)和
#-非选项参数(getopts不需要命令行参数)。
#所有非选项参数都放置在字符串non_option_参数中。这个
#需要getopts的静默错误报告模式。下面的命令行
#参数解析,输入信息可根据内部
#优先权假设。
#
#用法示例:
#/script.sh
#非选项参数:
#./script.sh-狄拉克
#-由参数Dirac触发
#非选项参数:
#./script.sh-a Dirac-b
#-由参数Dirac触发
#-b触发
#非选项参数:
#./script.sh-a狄拉克·费曼-b
#-由参数Dirac触发
#-b触发
#非选项参数:Feynman
#./script.sh-a狄拉克·费曼出生-b
#-由参数Dirac触发
#-b触发
#非选项参数:Feynman Born
#./script.sh-狄拉克·费曼出生-b
#-由参数Dirac触发
#-b触发
#非选项参数:Feynman Born
#
#想要:
#./script.sh-狄拉克·费曼出生-b
#-由参数Dirac触发
#-b触发
#非选项参数:Feynman Born
#
################################################################################
option_string=“:a:b”
非_选项_参数=“”
进程参数(){
OPTIND=1
而getopts“${option\u string}”选项;do
中的案例${option}
(a)
echo“-a由参数“${OPTARG}”“>&2”触发,输出到STDERR
;;
(b)
回显“-b触发”>&2#输出到STDERR
;;
\?)
echo“无效选项:-“${OPTARG}”>&2#输出到STDERR
;;
以撒
完成
移位$(expr${OPTIND}-1)
回显“$@”
}
参数=“${@}”
而[!-z“${parameters}]”;做
parameters=“$(进程参数${parameters})”
TEMP=$(回显“${parameters}”|awk-F”“{print$1}”)
IS|POS=“$(echo“${option\u string}”)sed's/^:-://';sed's/\([a-zA-Z]\)/\\1/g';sed's/\([a-zA-Z]\)/-\1/g';sed's/:///g';awk-v option=${TEMP}\
'{
对于(i=1;i我不太明白IS\u POS
变量应该做什么。在我的机器(mac)上它总是0。第二个“Born”的问题在于t\u数组的构造。当我将其更改为以下内容时:
T_ARRAY=$(echo "${parameters}" | awk -F " " 'NF > 1 { for( i=2; i<=NF; i++ ) printf("%s%s", $i, i == NF ? "" : " " ); next }')
我想问题出在
[ $IS_POS -eq 0 ] && [ "${TEMP}" == "${parameter}" ] && continue
参数循环匹配的行太多次。替换awk只是从参数中删除第一个元素-显然它没有注意IS_POS
。如果系统上的IS_POS
非零,则可能需要更改该值。您可以尝试按如下方式简化脚本:
non_option_par=""
par="${@}"
while [ ! -z "${par}" ]; do
par="$(process_arguments ${par})"
non_option_par="${non_option_par} "$(awk -F'[ \t]*-' '{print $1}' <<<"$par")
par=$(awk -F'[ \t]*-' 'NF>1{print substr($0,index($0,"-"))}' <<<"$par")
done
echo "non-option parameters:${non_option_par}"
non_option_par=“”
par=“${@}”
而[!-z“${par}]”;则
par=“$(进程参数${par})”
non_option_par=“${non_option_par}”$(awk-F'[\t]*-'{print$1}”非常感谢您在这方面的帮助。匹配太多次的循环被很好地发现了。非常感谢您在这方面的帮助。您的awk编码比我的好!
non_option_par=""
par="${@}"
while [ ! -z "${par}" ]; do
par="$(process_arguments ${par})"
non_option_par="${non_option_par} "$(awk -F'[ \t]*-' '{print $1}' <<<"$par")
par=$(awk -F'[ \t]*-' 'NF>1{print substr($0,index($0,"-"))}' <<<"$par")
done
echo "non-option parameters:${non_option_par}"