解析不适用于 getopt 的长命令行参数
Parsing long command-line arguments not working with getopt
作为我当前项目的一部分,我想为大型脚本解析长命令行参数。我以前从未尝试过 getopt 但想第一次尝试使脚本看起来整洁。
在尝试在那个大型项目脚本上推送 getopt 之前,我想先在示例脚本上进行检查。
在下面的示例脚本中,解析短命令行参数可以正常工作,但不能解析长命令行参数:
#!/bin/bash
options=$(getopt -o d:f:t: -l domain -l from -l to -- "$@")
[ $? -eq 0 ] || {
echo "Incorrect options provided"
exit 1
}
eval set -- "$options"
while true; do
case "" in
-d|--domain)
DOMAIN=;
shift
;;
-f|--from)
FROM=;
shift
;;
-t|--to)
TO=;
shift
;;
--)
shift
break
;;
*)
echo "Invalid options!!";
exit 1
;;
esac
shift
done
echo "Domain is $DOMAIN"
echo "From address is $FROM"
echo "To address is $TO"
exit 0;
输出:
# ./getopt_check.bash -d hello.com -f from@test.com -t to@test.com
Domain is hello.com
From address is from@test.com
To address is to@test.com
# ./getopt_check.bash --domain hello.com -f from@test.com -t to@test.com
Invalid options!!
# ./getopt_check.bash --domain hello.com --from from@test.com --to to@test.com
Invalid options!!
我在解析长命令参数时也期待相同的输出:
Domain is hello.com
From address is from@test.com
To address is to@test.com
调试时:
# bash -x getopt_check.bash --domain hello.com -f from@test.com -t to@test.com
++ getopt -o d:f:t: -l domain -l from -l to -- --domain hello.com -f from@test.com -t to@test.com
+ options=' --domain -f '\''from@test.com'\'' -t '\''to@test.com'\'' -- '\''hello.com'\'''
+ '[' 0 -eq 0 ']'
+ eval set -- ' --domain -f '\''from@test.com'\'' -t '\''to@test.com'\'' -- '\''hello.com'\'''
++ set -- --domain -f from@test.com -t to@test.com -- hello.com
+ true
+ case "" in
+ DOMAIN=-f
+ shift
+ shift
+ true
+ case "" in
+ echo 'Invalid options!!'
Invalid options!!
+ exit 1
在这里,问题是通过大小写切换或选择 -d|--domain
?.
我想这是您的 getopt 语法。使用 :
getopt -o d:f:t: -l domain:,from:,to: -- "$@"
而不是:
getopt -o d:f:t: -l domain -l from -l to -- "$@"
作为我当前项目的一部分,我想为大型脚本解析长命令行参数。我以前从未尝试过 getopt 但想第一次尝试使脚本看起来整洁。
在尝试在那个大型项目脚本上推送 getopt 之前,我想先在示例脚本上进行检查。
在下面的示例脚本中,解析短命令行参数可以正常工作,但不能解析长命令行参数:
#!/bin/bash
options=$(getopt -o d:f:t: -l domain -l from -l to -- "$@")
[ $? -eq 0 ] || {
echo "Incorrect options provided"
exit 1
}
eval set -- "$options"
while true; do
case "" in
-d|--domain)
DOMAIN=;
shift
;;
-f|--from)
FROM=;
shift
;;
-t|--to)
TO=;
shift
;;
--)
shift
break
;;
*)
echo "Invalid options!!";
exit 1
;;
esac
shift
done
echo "Domain is $DOMAIN"
echo "From address is $FROM"
echo "To address is $TO"
exit 0;
输出:
# ./getopt_check.bash -d hello.com -f from@test.com -t to@test.com
Domain is hello.com
From address is from@test.com
To address is to@test.com
# ./getopt_check.bash --domain hello.com -f from@test.com -t to@test.com
Invalid options!!
# ./getopt_check.bash --domain hello.com --from from@test.com --to to@test.com
Invalid options!!
我在解析长命令参数时也期待相同的输出:
Domain is hello.com
From address is from@test.com
To address is to@test.com
调试时:
# bash -x getopt_check.bash --domain hello.com -f from@test.com -t to@test.com
++ getopt -o d:f:t: -l domain -l from -l to -- --domain hello.com -f from@test.com -t to@test.com
+ options=' --domain -f '\''from@test.com'\'' -t '\''to@test.com'\'' -- '\''hello.com'\'''
+ '[' 0 -eq 0 ']'
+ eval set -- ' --domain -f '\''from@test.com'\'' -t '\''to@test.com'\'' -- '\''hello.com'\'''
++ set -- --domain -f from@test.com -t to@test.com -- hello.com
+ true
+ case "" in
+ DOMAIN=-f
+ shift
+ shift
+ true
+ case "" in
+ echo 'Invalid options!!'
Invalid options!!
+ exit 1
在这里,问题是通过大小写切换或选择 -d|--domain
?.
我想这是您的 getopt 语法。使用 :
getopt -o d:f:t: -l domain:,from:,to: -- "$@"
而不是:
getopt -o d:f:t: -l domain -l from -l to -- "$@"