当前位置: 首页 > 面试题库 >

Shell脚本参数解析

闻人思聪
2023-03-14
问题内容

关于这种事情有很多问题,但让我们想象一下,我们的目标是安装了getopt和getopts的通用Linux系统(不是我们将使用其中任何一种,但它们似乎很流行)

如何同时解析长参数(–example | –example简单选项)和短参数(-e | -esimple-example | -e简单示例)


问题答案:

您想使用getopt多头和空头期权。工作代码示例:

# Parse arguments
TEMP=$(getopt -n $PROGRAM_NAME -o p:P:cCkhnvVS \
--long domain-password:,pop3-password:\         
,create,cron,kill,help,no-sync-passwords,version,verbose,skip-pop3 \
-- "$@")

# Die if they fat finger arguments, this program will be run as root
[ $? = 0 ] || die "Error parsing arguments. Try $PROGRAM_NAME --help"

eval set -- "$TEMP"
while true; do     
        case $1 in 
                -c|--create)
                        MODE="CREATE"; shift; continue
                ;;                                    
                -C|--cron)                            
                        MODE="CRON"; shift; continue  
                ;;                                    
                -k|--kill)                            
                        MODE="KILL"; shift; continue  
                ;;                                    
                -h|--help)                            
                        usage                         
                        exit 0                        
                ;;                                    
                -n|--no-sync-passwords)               
                        SYNC_VHOST=0; shift; continue 
                ;;                                    
                -p|--domain-password)                 
                        DOMAIN_PASS="$2"; shift; shift; continue
                ;;                                              
                -P|--pop3-password)                             
                        POP3_PASS="$2"; shift; shift; continue  
                ;;                                              
                -v|--version)                                   
                        printf "%s, version %s\n" "$PROGRAM_NAME" "$PROGRAM_VERSION"
                        exit 0                                                      
                ;;                                                                  
                -v|--verbose)                                                       
                        VERBOSE=1; shift; continue                                  
                ;;                                                                  
                -S|--skip-pop3)                                                     
                        SKIP_POP=1; shift; continue                                 
                ;;                                                                  
                --)                                                                 
                        # no more arguments to parse                                
                        break                                                       
                ;;                                                                  
                *)                                                                  
                        printf "Unknown option %s\n" "$1"                           
                        exit 1                                                      
                ;;                                                                  
        esac                                                                        
done

注意,die是先前定义的功能(未显示)。

-n选项告诉getopt将错误报告为我的程序的名称,而不是getopt-o定义一个简短选项列表(:在一个选项之后指示所需的参数)并--long指定一个长选项列表(对应于简短选项)。

其余的只是一个简单的开关,shift适当地调用以前进参数指针。注意,打电话shift; shift;只是一种顽固的习惯。在当前的现代世界中,shift 2可能就足够了。

现代的getopt在较新的平台上非常一致,但是您可能会在较旧的系统(大约在Redhat 9之前)上遇到一些可移植性问题。请参阅man getopt以获取有关向后兼容性的信息。但是,您不太可能会遇到它的需求。

最后,在解析选项之后,您可以再次调用:

eval set -- "$@"

在完成getopt解析选项后,这会将参数指针移至命令行上剩余的任何位置。然后,您可以shift继续阅读它们。例如,如果命令如下所示:

./foo --option bar file1.txt file2.txt file3.txt

完成后,别忘了提供一个方便的-h / --help选项来打印新的花式选项。:)如果使该输出对help2man友好,则会有一个即时手册页与您的新工具一起使用。

编辑

在大多数发行版中,您可以在中找到更多示例getopt代码/usr/share/doc/util- linux/examples,这些代码应默认情况下已安装。



 类似资料:
  • 问题内容: 我想将参数传递给它。 我已经习惯了这样做,,....但我要开始对其进行命名 问题答案: 有很多方法可以解析sh中的参数。Getopt很好。这是一个简单的脚本,可以手动解析内容: 运行示例如下: 请注意,由于脚本eval是由用户构造的字符串,因此它甚至不具有强大的鲁棒性,也没有向安全漏洞开放。它仅是作为一种可能的做事方式的示例。一种更简单的方法是要求用户在环境中传递数据。在bourne

  • 本文向大家介绍Shell脚本传参数方法总结,包括了Shell脚本传参数方法总结的使用技巧和注意事项,需要的朋友参考一下 一、接收固定长度的参数 空参数执行 传递2个参数执行 二、那如果还有参数怎么办呢?还要一个个加上来吗?答案是否定的 以下用法应该不陌生,就是直接执行脚本本身,没有附带任何参数,那么脚本讲抛出帮助信息.即怎么使用此脚本.见红字部分 代码如下 详细的执行过程如下 不传参数执行 传递3

  • 本文向大家介绍详解shell中脚本参数传递的两种方式,包括了详解shell中脚本参数传递的两种方式的使用技巧和注意事项,需要的朋友参考一下 方式一:$0,$1,$2.. 采用$0,$1,$2..等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${10},${11}....才能获取到参数,但是一般很少会超过

  • 问题内容: 如何参数化在网格上执行的shell脚本(以qsub开头)?我有一个shell脚本,在这里我使用getopts读取参数。 当我启动(qsub script.sh -r firstparam -s secondparam ..)这个带有qsub的工作脚本时,我收到错误消息, qsub:无效选项-s qsub:非法-r值 正如qsub认为该参数本身就是。但是我还没有找到任何解决方案。 谢谢

  • 终于到shell 脚本这章了,在以前笔者卖了好多关子说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维工作中非常非常重要。下面笔者就带你正式进入shell脚本的世界吧。 到现在为止,你明白什么是shell脚本吗?如果明白最好了,不明白也没有关系,相信随着学习的深入你就会越来越了解到底什么是shell脚本。首先它是一个脚本,并不能作为正式的编程语言。因为是跑在linux的s

  • bash csh ksh zsh 基本语法 定义和使用变量 #!/bin/sh a=" hello world" echo $a echo 'a is xiaxaiwen${a}' if else if ....; then   .... elif ....; then   .... else   .... fi [] 条件测试 [] 中前后一定要加空格 sh