我正在尝试创建一个getopt命令,这样当我将"-ab"参数传递给脚本时,该脚本会将-ab视为单个参数.
#!/bin/sh
args=`getopt "ab":fc:d $*`
set -- $args
for i in $args
do
case "$i" in
-ab) shift;echo "You typed ab $1.";shift;;
-c) shift;echo "You typed a c $1";shift;;
esac
done
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不起作用.有人可以提供任何帮助吗?
我不知道是否可能,但我想编写shell脚本,其作用类似于带有选项的常规可执行文件.作为一个非常简单的示例,请考虑配置为可执行的shell脚本foo.sh:
./foo.sh
./foo.sh -o
Run Code Online (Sandbox Code Playgroud)
而代码的foo.sh作用就像
#!/bin/sh
if ## option -o is turned on
## do something
else
## do something different
endif
Run Code Online (Sandbox Code Playgroud)
有可能,怎么做?谢谢.
我刚刚发现这getopt不是跨平台的(特别是对于FreeBSD和Linux).这个问题的最佳解决方法是什么?
我看到的所有东西getopt或者getopts只是支持单字符选项的略微发烧友(例如-h但不是--help).我想做一些花哨的长期选择.
经过几天的研究,我仍然无法找到在.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) 这是我的问题.在bash 3中:
$ test='One "This is two" Three'
$ set -- $test
$ echo $2
"This
Run Code Online (Sandbox Code Playgroud)
如何获得的bash了解行情,并返回$ 2作为This is two和不"This?不幸的是,我不能改变test这个例子中调用的变量的构造.
我有一个简单的脚本(下面),它具有互斥的参数.
./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) 所以我正在 zsh 中编写一个小脚本,它可以接受多个参数。然而,用户碰巧传递的参数是无序的。例如,这将是对脚本的有效调用:
./logproc.sh --include /var/log --exclude-file-ext gz,bz --show-only
Run Code Online (Sandbox Code Playgroud)
现在,我可以使用 $1、$2 等位置参数来期望--include首先、然后--exclude-file-ext等等。但用户是这样调用脚本的:
./logproc.sh --show-only --exclude-file-ext gz,bz --include /var/log
Run Code Online (Sandbox Code Playgroud)
或者
./logproc.sh --exclude-file-ext gz,bz --show-only --include /var/log
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,添加更多功能的需求不断增加,并且确定传递给脚本的参数的排列和组合将会呈爆炸式增长。
zsh 中是否有内置工具或命令(可以在脚本中调用的外部工具)可用于找出发送到脚本的参数?
PS:我正在寻找 ZSH 特定的解决方案。
编写Bash脚本时,当作为命令行中选项标志的一部分提供时,如何从命令行获取值?
例如以下内容:
./script --value=myText --otherValue=100
Run Code Online (Sandbox Code Playgroud)
如何将myText和100值存储在变量$textand中$num?
我在他们的网站上关注IBM的例子:
(清单#5)http://www.ibm.com/developerworks/library/l-bash-parameters/index.html
#!/bin/bash
echo "OPTIND starts at $OPTIND"
while getopts ":pq:" optname
do
case "$optname" in
"p")
echo "Option $optname is specified"
;;
"q")
echo "Option $optname has value $OPTARG"
;;
"?")
echo "Unknown option $OPTARG"
;;
":")
echo "No argument value for option $OPTARG"
;;
*)
# Should not occur
echo "Unknown error while processing options"
;;
esac
echo "OPTIND is now $OPTIND"
done
Run Code Online (Sandbox Code Playgroud)
我想要的是有一个名字超过1个字母的选项.即-pppp和-qqqq而不是-p和-q.
我写了我的程序并实现-help给了我一个问题......