由于某种原因,选项在第一次调用时运行良好lib_progress_bar -c "@" -u "_" 0 100,但在第二次调用时超出一切都是默认值,因为getopts c:u:d:p:s:%:m: flag第二次看似不是真的,或者至少在我使用时从未执行过的情况set -x
#!/bin/bash
lib_progress_bar() {
local current=0
local max=100
local completed_char="#"
local uncompleted_char="."
local decimal=1
local prefix=" ["
local suffix="]"
local percent_sign="%"
local max_width=$(tput cols)
local complete remain subtraction width atleast percent chars
local padding=3
while getopts c:u:d:p:s:%:m: flag; do
case "$flag" in
c) completed_char="$OPTARG";;
u) uncompleted_char="$OPTARG";;
d) decimal="$OPTARG";;
p) prefix="$OPTARG";;
s) suffix="$OPTARG";;
%) percent_sign="$OPTARG";;
m) max_width="$OPTARG";;
esac
done
shift $((OPTIND-1))
current=${1:-$current}
max=${2:-$max}
if (( decimal > …Run Code Online (Sandbox Code Playgroud) 我的shell脚本非常简单,如下所示:
while getopts "abc:" flag; do
echo "$flag" $OPTIND $OPTARG
done
Run Code Online (Sandbox Code Playgroud)
我做了一些测试如下:
Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -abc CCC Blank
a 1
b 1
c 3 CCC
Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -a -b -c CCC Blank
a 2
b 3
c 5 CCC
Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -ab -c CCC Blank
a 1
b 2
c 4 CCC
Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -a -bc CCC Blank
a 2
b 2
c 4 CCC
Run Code Online (Sandbox Code Playgroud)
我无法理解如何OPTIND使用不同的命令行调用,我对输出感到困惑.
你能帮助弄清楚计算机制OPTIND吗?
经过几天的研究,我仍然无法找到在.sh脚本中解析cmdline args的最佳方法.根据我的参考资料,getopts cmd是要走的路,因为它"在不干扰位置参数变量的情况下提取和检查开关.意外的开关或缺少参数的开关被识别并报告为错误. "
当涉及空格但是可以识别常规和长参数(-p和--longparam)时,位置参数(例如2 - $ @,$#等)显然不能正常工作.我注意到,当使用嵌套引号传递参数时,这两种方法都会失败("这是"引用""引号"".").这三个代码示例中哪一个最能说明处理cmdline args的方法?大师不推荐使用getopt函数,所以我试图避免它!
例1:
#!/bin/bash
for i in "$@"
do
case $i in
-p=*|--prefix=*)
PREFIX=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
-s=*|--searchpath=*)
SEARCHPATH=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
-l=*|--lib=*)
DIR=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
;;
--default)
DEFAULT=YES
;;
*)
# unknown option
;;
esac
done
exit 0
Run Code Online (Sandbox Code Playgroud)
例2:
#!/bin/bash
echo ‘number of arguments’
echo "\$#: $#"
echo ”
echo ‘using $num’
echo "\$0: $0"
if [ $# -ge 1 ];then …Run Code Online (Sandbox Code Playgroud) 我有脚本,我需要显示使用命令,以防用户在执行脚本时错过任何必要的信息.
Usage : Script -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value>
Run Code Online (Sandbox Code Playgroud)
随着所有的解释 OPTIONS
我从参数中得到的值如下变量时尚.但我希望在shell脚本中使用此验证.
SERVER=$1
INSTANCE=$2
USER=$3
DB_PASSWD=$4
QUERY=$5
VAL_WARN=$6
VAL_CRIT=$7
Run Code Online (Sandbox Code Playgroud)
我尝试过使用getopts,但由于在传递值之前<query>没有-q参数,因此无法使用.
我已经尝试找到所有其他方法,但每个人都建议getopts这对我来说不是可行的解决方案.
请帮我这个..
我有一个简单的脚本(下面),它具有互斥的参数.
./scriptname.sh -m|-d [-n]但是,脚本的参数应该是用户可以运行./scriptname.sh -m -d错误的脚本.
问题:如何强制用户只提供了一个互斥参数?
#!/bin/sh
usage() {
cat <<EOF
Usage: $0 -m|-d [-n]
where:
-m create minimal box
-d create desktop box
-n perform headless build
EOF
exit 0
}
headless=
buildtype=
while getopts 'mdnh' flag; do
case "$flag" in
m) buildtype='minimal' ;;
d) buildtype='desktop' ;;
n) headless=1 ;;
h) usage ;;
\?) usage ;;
*) usage ;;
esac
done
[ -n "$buildtype" ] && usage
Run Code Online (Sandbox Code Playgroud) 是否可以在 bash 中使用 getopts 实现布尔 cli 选项?基本上,如果-x指定了,我想做一件事,如果没有指定,则做另一件事。
我解析了一些类似的问题,但这些问题并不适合我.
我有这个很棒的bash脚本,可以执行一些很酷的功能,这里是代码的相关部分:
while getopts ":hhelpf:d:c:" ARGS;
do
case $ARGS in
h|help )
help_message >&2
exit 1
;;
f )
F_FLAG=1
LISTEXPORT=$OPTARG
;;
d )
D_FLAG=1
OUTPUT=$OPTARG
;;
c )
CLUSTER=$OPTARG
;;
\? )
echo ""
echo "Unimplemented option: -$OPTARG" >&2
echo ""
exit 1
;;
: )
echo ""
echo "Option -$OPTARG needs an argument." >&2
echo ""
exit 1
;;
* )
help_message >&2
exit 1
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
现在,如果触发,我的所有选项都运行良好.我想要的是getopts 在没有触发选项时吐出help_message函数,比如脚本只是在没有参数的情况下启动./scriptname.sh.
我在这里看到了一些方法,实现了IF循环和函数, …
我想在bash中使用getopts.用户应该选择自己的选项.大多数选项都有参数,但有两个选项没有参数.当没有参数的选项位于命令的中间时,它工作正常,但是当它在结尾时它不起作用.
注意 - 前两个参数(服务器和密码)是必需的,而不是getopts的一部分.
#!/bin/bash
SERVER=${1}
PASSWORD=${2}
VERSION=v0
ASKED_REVISION=0
DB=schema_1
PROPERTIES=1
FULL=0
USER=
# Usage info
show_help()
{
echo "
Usage: Environment DBPassword [-V Version] [-R Revision] [-S Schema] [-P] [-F] [-U Username]
-V Version Version to deploy.
-R Revision Revision number (0 means the latest revision).
-S Schema Schema in the DB to deploy.
-P No(!) External Properties. If this flag is marked the deploy will not copy the external properties
-F Full deploy
-U Username. This User who …Run Code Online (Sandbox Code Playgroud) 我正在创建一个非常简单的sh文件来执行某些操作,但我想传递一个没有值的参数,例如:
./fuim -l
Run Code Online (Sandbox Code Playgroud)
但我收到以下消息:
./fuim: option requires an argument -- l
Run Code Online (Sandbox Code Playgroud)
如果我传递一个随机值,就像./fuim -l 1它完美无缺.我怎样才能做到这一点?
这是我到目前为止所拥有的:
while getopts e:f:l:h OPT
do
case "$OPT" in
h) print_help ;;
e) EXT=$OPTARG ;;
f) PROJECT_FOLDER=$OPTARG ;;
l) LIST_FILES=1 ;;
?) print_help ;;
esac
done
shift $((OPTIND-1))
if [ -z "$EXT" ] || [ -z "$PROJECT_FOLDER" ]; then
print_help
fi
Run Code Online (Sandbox Code Playgroud) 我使用以下行(希望这是最好的做法,如果不能纠正我)来处理命令行选项:
#!/usr/bin/bash
read -r -d '' HELP <<EOF
OPTIONS:
-c Enable color output
-d Enable debug output
-v Enable verbose output
-n Only download files (mutually exclusive with -r)
-r Only remove files (mutually exclusive with -n)
-h Display this help
EOF
# DECLARE VARIABLES WITH DEFAULT VALUES
color=0
debug=0
verbose=0
download=0
remove=0
OPTIND=1 # Reset in case getopts has been used previously in the shell
invalid_options=(); # Array for invalid options
while getopts ":cdvnrh" opt; do
echo "Actual opt: …Run Code Online (Sandbox Code Playgroud)