当前位置:  操作系统/服务器>linux

linux shell命令行选项与参数用法详解

    来源: 互联网  发布时间:2014-10-16

    本文导语:  问题描述:在linux shell中如何处理tail -n 10 access.log这样的命令行选项?在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。1,直接处理,依次对$1,$2,...,$n进行解析,分别手工处理;2,getopts来处理...

问题描述:在linux shell中如何处理tail -n 10 access.log这样的命令行选项?
在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。
1,直接处理,依次对$1,$2,...,$n进行解析,分别手工处理;
2,getopts来处理,单个字符选项的情况(如:-n 10 -f file.txt等选项);
3,getopt,可以处理单个字符选项,也可以处理长选项long-option(如:--prefix=/home等)。
总结:小脚本手工处理即可,getopts能处理绝大多数的情况,getopt较复杂、功能也更强大。
1,直接手工处理位置参数
必须要要知道几个变量,
代码如下:

   *    $0 :即命令本身,相当于c/c++中的argv[0]
    *    $1 :第一个参数.
    *    $2, $3, $4 ... :第2、3、4个参数,依次类推。
    *    $#  参数的个数,不包括命令本身
    *    $@ :参数本身的列表,也不包括命令本身
    *    $* :和$@相同,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组。

手工处理方式能满足多数的简单需求,配合shift使用也能构造出强大的功能,但处理复杂选项时建议用下面的两种方法。
例子,(getargs.sh):

代码如下:

#!/bin/bash
if [ $# -lt 1 ]; then
    echo "error.. need args"
    exit 1
fi
echo "commond is $0"
echo "args are:"
for arg in "$@"
do
    echo $arg
done


运行命令:

代码如下:

./getargs.sh 11 22 cc
commond is ./getargs.sh
args are:
11
22
cc

2,getopts (shell内置命令)
处理命令行参数是一个相似而又复杂的事情,为此,c提供了getopt/getopt_long等函数,c++的boost提供了options库,在shell中,处理此事的是getopts和getopt。
getopts/getopt的区别,getopt是个外部binary文件,而getopts是shell builtin。

代码如下:

[root@jbxue ~]$ type getopt
getopt is /usr/bin/getopt
[root@jbxue ~]$ type getopts
getopts is a shell builtin

getopts不能直接处理长的选项(如:--prefix=/home等)
关于getopts的使用方法,可以man bash  搜索getopts
getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。getopts从命令中获取这些参数,并且删去了“-”,并将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“optarg”中。提供getopts的shell内置了optarg这个变变,getopts修改了这个变量。
这里变量$optarg存储相应选项的参数,而$optind总是存储原始$*中下一个要处理的元素位置。
while getopts ":a:bc" opt  #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数
例子,(getopts.sh):

代码如下:

echo $*
while getopts ":a:bc" opt
do
        case $opt in
                a ) echo $optarg
                    echo $optind;;
                b ) echo "b $optind";;
                c ) echo "c $optind";;
                ? ) echo "error"
                    exit 1;;
        esac
done
echo $optind
shift $(($optind - 1))
#通过shift $(($optind - 1))的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell编程处理了。
echo $0
echo $*


执行命令:

代码如下:

./getopts.sh -a 11 -b -c
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh

3,getopt(一个外部工具)
具体用用法可以 man getopt
#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg
#--long表示长选项
例子,(getopt.sh):

代码如下:

#!/bin/bash
# a small example program for using the new getopt(1) program.
# this program will only work with bash(1)
# an similar program using the tcsh(1) script. language can be found
# as parse.tcsh
# example input and output (from the bash prompt):
# ./parse.bash -a par1 'another arg' --c-long 'wow!*?' -cmore -b " very long "
# option a
# option c, no argument
# option c, argument `more'
# option b, argument ` very long '
# remaining arguments:
# --> `par1'
# --> `another arg'
# --> `wow!*?'
# note that we use `"$@"' to let each command-line parameter expand to a
# separate word. the quotes around `$@' are essential!
# we need temp as the `eval set --' would nuke the return value of getopt.
#-o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项
#如-carg 而不能是-c arg
#--long表示长选项
#"$@"在上面解释过
# -n:出错时的信息
# -- :举一个例子比较好理解:
#我们要创建一个名字为 "-f"的目录你会怎么办?
# mkdir -f #不成功,因为-f会被mkdir当作选项来解析,这时就可以使用
# mkdir -- -f 这样-f就不会被作为选项。
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!
#set 会重新排列参数的顺序,也就是改变$1,$2...$n的值,这些值在getopt中重新排列过了
eval set -- "$temp"
#经过getopt的处理,下面处理具体选项。
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 are in quoted mode,
                        # an empty parameter will be generated if its optional
                        # argument is not found.
                        case "$2" in
                                "") echo "option c, no argument"; shift 2 ;;
                                *)  echo "option c, argument `$2'" ; shift 2 ;;
                        esac ;;
                --) shift ; break ;;
                *) echo "internal error!" ; exit 1 ;;
        esac
done
echo "remaining arguments:"
for arg do
   echo '--> '"`$arg'" ;
done

运行命令:
代码如下:

./getopt.sh --b-long abc -a -c33 remain
option b, argument `abc'
option a
option c, argument `33'
remaining arguments:
--> `remain'

以上就是有关linux shell命令行选项与参数用法的详细内容,希望对大家有所帮助。

    
 
 

您可能感兴趣的文章:

  • Linux c++虚函数(virtual function)简单用法示例代码
  • 求linux C++的时间相关函数及用法,急用,谢谢
  • Linux下chmod命令详细介绍及用法举例
  • linux shell中变量的用法
  • linux下nm命令(显示可执行文件的符号信息)介绍以及常见nm命令用法举例
  • linux 环境下有什么工具可以得到C函数的用法和参数的意义?????????我很想学LINUX
  • linux c malloc函数定义及用法详解
  • [Linux Shell编程] sftp 有没有非交互方式的用法
  • linux ramfs和tmpfs区别及用法介绍
  • 请教 linux seteuid() 的用法
  • Linux下curl的下载,安装以及curl命令的详细参数,用法介绍
  • 请问 Linux kernel Memory Management API,有哪些?在哪儿能找到用法?谢谢
  • Linux c++ boost库正则表达式用法
  • linux cat用法
  • Linux下C语言strstr()查找子字符串位置函数详细介绍(strstr原型、实现及用法)
  • linux 搜索文件的用法
  • linux下objdump命令用法介绍及如何使用objdump命令进行反汇编
  • 大家能不能给我介绍点关于Linux内路由过程及route指令的详细用法的好文章。
  • linux下lsof命令介绍及lsof命令具体用法举例
  • linux下ADSL的用法
  • linux内核中的likely宏和unlikely宏介绍及用法
  • linux的vsftpd用法(详细)
  • Linux/centos/redhat下各种压缩解压缩方式详解
  • linux 2.4 内核软中断详解?
  • linux下进程占用内存空间详解
  • 大家推荐几本详解Linux或unix 操作系统源代码的书籍!!!!
  • Linux下NFS服务配置详解
  • 哪有LINUX命令详解下??
  • linux下top命令详解包括top命令参数使用及结果(virt,res,shr)排序举例说明
  • 如何在Linux下使用脚本实现程序的自动重启!望各位详解!
  • SSL握手通信详解及linux下c/c++ SSL Socket代码举例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了? iis7站长之家
  • linux图形模式下shutdown里有Hibernate这个选项。怎么man shutdown里找不到hibernate这个选项呢。
  • linux/centos源码安装nginx编译配置选项参数介绍
  • 删除linux后,系统启动项中仍然有linux选项
  • linux的命令,怎么能知道这个命令的默认选项是什么?
  • arm-linux-gcc不能识别-02选项?
  • 求助!安装Linux时设错了Windows(DOS)启动的选项,怎样恢复启动Windows?急啊!
  • 我发现在Redhat Linux中有个选项可以连上MSN,不知怎么才可以连上,谢谢
  • 如何在linux c下判断nan?是不是要增加特别的编译选项?
  • 我的linux setup->system service 中没有wu-ftp选项,我该安装哪个包?
  • PG5为什么无法进行Linux Swap的分区,根本就没有这一个选项,难受!
  • 怎样让linux在启动时,启动存在ip冲突的网卡?与内核选项有关吗?
  • linux内核配置中的SMDK选项是什么
  • 安装完redhatlinux9.0重新启动后,不能进入linux,直接进入xp,也没有选项,为什么?
  • linux路由器配置,内核配置中怎么找不到optimize as router not host选项!
  • 请问:安装了MANDRAKE LINUX9.0,win2k,现在想重新安装WIN2K,不知道会影响启动选项吗?
  • 我在重装了WINDOWS后,开机时没有出现让我进入哪一操作系统的选项。我该如何进入linux
  • 弱弱地问:在linux-2.4.X的make menuconfig中为什么找不到arm的处理器选项????
  • 请问: linux下的命令行的选项参数有时 有时用二个横线,有时用一个横线标识,有时又不用,有什么区别啊?
  • 我要缩减LINUX内核,make menuconfig时把一些选项去掉,再make dep没错,但再make bzImage时却会提错,但我make menuconfig时不改变任何选现(
  • xp下安装好Linux可是启动时没有选项进入
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3