我正在尝试构建一个接受各种选项的 shell 脚本,这getopts似乎是一个很好的解决方案,因为它可以处理选项和参数的可变排序(我认为!)。
我只会使用短选项,每个短选项都需要一个相应的值,例如:./command.sh -a arga -g argg -b argb但我希望允许以非特定顺序输入选项,这是大多数人习惯使用 shell 命令的方式.
另一点是我想自己检查选项参数值,最好是在case语句中。这样做的原因是我:)在case声明中的测试产生了不一致的结果(可能是由于我缺乏理解)。
例如:
#!/bin/bash
OPTIND=1 # Reset if getopts used previously
if (($# == 0)); then
echo "Usage"
exit 2
fi
while getopts ":h:u:p:d:" opt; do
case "$opt" in
h)
MYSQL_HOST=$OPTARG
;;
u)
MYSQL_USER=$OPTARG
;;
p)
MYSQL_PASS=$OPTARG
;;
d)
BACKUP_DIR=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 2;;
:)
echo "Option -$OPTARG requires an argument" >&2
exit 2;; …Run Code Online (Sandbox Code Playgroud) 我按照这里的教程学习如何使用getopts. 我能够执行用户正确提供的所有选项。但是现在我想在没有提供任何选项时执行默认选项。
例如:
while getopts ":hr" opt; do
case $opt in
h )
show_help;
exit 1
;;
r )
echo "Default option executed"
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
因此,如果用户提供-h或-r,则应执行相应的命令(实际上确实如此),但是当没有提供这些选项时-r,默认情况下应执行。有没有办法实现这一目标?
更新
我尝试了cas's建议并包含*)在我的getopts功能中,但似乎没有发生任何事情。
while getopts ":hr" opt; do
case $opt in
h )
show_help;
exit 1
;;
r )
echo "Default option executed"
;;
\? )
echo error "Invalid option: -$OPTARG" >&2
exit 1
;;
: )
echo …Run Code Online (Sandbox Code Playgroud) 当我在看这个答案/sf/answers/774563751/以弄清楚如何使用参数时,--something或者-s关于答案脚本的一些问题:
#!/bin/bash
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
-n 'example.bash' -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
while true ; do
case "$1" in
-a|--a-long) echo "Option a" ; shift ;;
-b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
-c|--c-long)
# c has an optional argument. As we …Run Code Online (Sandbox Code Playgroud) 标准实用程序的 Linux 基础列表包括getopts但不包括getopt. Posix 实用程序的Open Group列表类似。
同时,维基百科的标准 Unix 命令列表包括getopt但不包括getopts. 同样,Windows Subsystem for Linux(基于 Ubuntu 基于 Debian)也包括getopt但不包括getopts(它是GNU 增强版)。
balter@spectre:~$ which getopt
/usr/bin/getopt
balter@spectre:~$ getopt -V
getopt from util-linux 2.27.1
balter@spectre:~$ which getopts
balter@spectre:~$
Run Code Online (Sandbox Code Playgroud)
因此,如果我想选择一个我最有信心使用更标准 Linux 发行版(例如 Debian、Red Hat、Ubuntu、Fedora、CentOS 等)的人,我应该选择哪个?
感谢 Michael 和 Muru 解释了内置与可执行文件。我刚刚也偶然发现了这个,其中列出了 bash 内置函数。
我正在使用getopts所有需要高级选项解析的脚本,并且它与dash. 我熟悉标准的基本getopts用法,包括[-x]和[-x OPTION]。
是否可以解析这样的选项?
dash_script.sh FILE -x -z -o OPTION
## Or the inverse?
dash_script.sh -x -z -o OPTION FILE
Run Code Online (Sandbox Code Playgroud) 我正在编写一个包装脚本,用于getopts为mysqldump. 到目前为止,它运行良好。
然而,我想做的一件事是能够在我的 shell 脚本中添加另一个选项,其内容应该准确地传递给 mysqldump 命令。有点像这样传递的选项:
./mysqldumpwrapper.sh -u username -p password -h localhost -o "--no-create-db --replace"
-o 参数的字符串内容完全传递给我的mysqldump命令。
因为我getopts在尝试上述操作时正在使用,所以我得到以下输出:
Invalid option: --
有谁知道如何解决这个问题?
有没有办法逃避选项的输入,这样getopts就不会将内容解析为另一个选项?
然后,当涉及到从我的 shell 脚本触发实际命令时,这就是我所得到的:
mysqldump "$OPTIONSPASSTHROUGH" --host=$MYSQL_HOST --user=$MYSQL_USER --password=$MYSQL_PASS "$DB" > "$FILE_DEST"
因为 OPTIONSPASTHROUGH 变量中很可能有空格,所以我在该命令中引用了该变量。那是对的吗?
根据几个 来源,UNIX 实用程序指南指定操作数应始终在选项之后处理:
utility_name[OPTIONS][operands...]
Run Code Online (Sandbox Code Playgroud)
众所周知,一些较旧的 UNIX 实用程序并不完全遵循这些约定,例如 ,find但较新的和完善的实用程序也违反了规则而没有明显的解释,例如curl <url>。
我想知道这是否有充分的理由以及社区对此的普遍共识是什么。
我的脚本中有以下命令:
set -- `getopt -q agvc:l:t:i: "$@"`
...
while [ -n "$1" ]
do
-i) TIME_GAP_BOOT=$2
shift ;;
...
sleep $TIME_GAP_BOOT
Run Code Online (Sandbox Code Playgroud)
使用 调用脚本时-i 2,出现错误
sleep: invalid time interval `\'2\''
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如何正确格式化参数?
问题
我有一个接受几个不同(可选)命令行参数的脚本。对于一个特定的论点,我得到了“less”的值,但我不知道为什么。
重击代码
while getopts ":d:f:p:e:" o; do
case "${o}" in
d)
SDOMAIN=${OPTARG}
;;
f)
FROM=${OPTARG}
;;
p)
PAGER=${OPTARG}
;;
e)
DESTEXT=${OPTARG}
;;
*)
show_usage
;;
esac
done
source "./utils.sh"
test #test includes
echo "$SDOMAIN is the sdomain"
echo "$FROM is the from"
echo "$PAGER is the pager"
echo "$DESTEXT is the extension"
exit
Run Code Online (Sandbox Code Playgroud)
输出
当我运行我的脚本时,这是我看到的:
lab-1:/tmp/jj# bash mssp.sh -d testdomain.net
Utils include worked!
testdomain.net is the sdomain
is the from
less is the pager
is the extension
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我在寻呼机中得到“更少”的价值。我希望看到空字符串。如果你能看到我的错误,请告诉我。我已经看这个太久了。
我试图在 while 循环中调用一个函数并传递一些参数。但是,getopts只能获取第一次调用的参数。
这是一个最小的例子:
function add_all_external_services() {
env | sed -n "s/^EXTERNAL_SERVICE_OPTIONS_\(.*\)$/\1/p" > options
while read -r line
do
key="${line%%=*}"
opt="${line#*=}"
if [[ -n "$key" && -n "$opt" ]]; then
echo "Adding external service \"$key\" with options: \"$opt\""
add_external_service $opt
else
echo "Missing one or more variables:
- Key: \"$key\"
- Options: \"$opt\"
"
fi
done < options
rm options
}
function add_external_service() {
local local_service_name=""
local external_service_name=""
local external_service_namespace=""
local service_url=""
echo " Options: $@"
while getopts …Run Code Online (Sandbox Code Playgroud) getopts ×10
bash ×6
shell-script ×3
arguments ×2
options ×2
bash-script ×1
conventions ×1
dash ×1
eval ×1
linux ×1
parameter ×1
posix ×1
shell ×1
utilities ×1
variable ×1