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

问题描述:在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命令行选项与参数用法的详细内容,希望对大家有所帮助。

(0)

相关推荐

  • Shell日志分析常用命令和例子

    学会用shell分析日志只要一上午!!! 很多地方分享了日志分析的shell脚本,但是基本没说每个命令符的具体含义,学习成本还是很高,在这里总结下,方便大家快速入门. 1.在Windows下的用户要使用shell命令符的话请先安装cygwin,安装方法自行Google(搜技术问题请使用google,百度搜不到活该) 2.下面粗略介绍下SEO日志分析常用的命令符用法,需要详细了解每个命令符请使用Google. less 文件名 查看文件内容 按"q" 退出 cat 文件名 打开文件,可以

  • hbase shell基础和常用命令详解

    HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase中的海量数据,利用Zookeeper作为协同服务. 1. 简介 HBase是一个分布式的.面向列的开源数据库,源于google的一篇论文<bigtable:一个结构化数据的分布式存储系统>.HBase是Google Bigtable的开源实现,它利用Hadoop HDFS作为其文件存储系统,利用Hadoop MapReduce来处理HBase

  • 用shell命令读取与输出数据的代码

    shell脚本读取数据有以下几种方式:1.键盘输入,默认2.从文件中读取3.通过管道命令传递 echo的功能:\c :不换行\f :进纸\t :跳格\n :换行\表示转义,例如:"\"/dev/rmt0"\"翻译为,"/dev/rmt0" read:从键盘或文件的某一行文本中读取信息,并将其赋给一个变量. 复制代码 代码如下: [jb51]/>read namehello i am a regular user[jb51]/>echo

  • Shell脚本test命令使用总结和实例

    Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数 说明 -eq 等于则为真 -ne 不等于则为真 -gt 大于则为真 -ge 大于等于则为真 -lt 小于则为真 -le 小于等于则为真 例如: 复制代码 代码如下: num1=100 num2=100 if test $[num1] -eq $[num2] then     echo 'The two numbers are equal!' else     echo 'The t

  • 25个好用的Shell脚本常用命令分享

    1.列出所有目录使用量,并按大小排序. 复制代码 代码如下: ls|xargs du -h|sort -rn #不递归下级目录使用du -sh 2.查看文件排除以#开关和空白行,适合查看配置文件. 复制代码 代码如下: egrep -v "^#|^$"  filenamesed '/#.*$/d; /^ *$/d' 3.删除空格和空行. 复制代码 代码如下: sed '/^$/d' filename #删除空行sed 's/ //g' filenamesed 's/[[:space:]

  • Shell 命令执行顺序分析[图]

    Shell 从标准输入或脚本中读取的每一行称为管道(pipeline);它包含了一个或多个命令(command),这些命令被一个或多个管道字符(|)隔开. 事实上还有很多特殊符号可用来分隔单个的命令:分号(;).管道(|).&.逻辑AND (&&),还有逻辑OR (||).对于每一个读取的管道,Shell都回将命令分割,为管道设置I/O,并且对每一个命令依次执行下面的操作: 整个步骤顺序如上图所示,看起来有些复杂.当命令行被处理时,每一个步骤都是在Shell的内存里发生的;Shel

  • Shell脚本中实现切换用户并执行命令操作

    今天公司同事来找到我说要在服务器上用另外一个用户执行python脚本,但设置到crontab里却老是root用户来执行,为了省事我就想了一个偷懒的办法,就是用shell脚本切换到那个用户,然后去执行那个python脚本.好了,这篇文章我只演示怎么用shell脚本切换到其他用户执行命令. 系统:centos 5.x 脚本内容: cat test.sh 复制代码 代码如下: #!/bin/bash su - test <<EOF pwd; exit; EOF 执行结果图: 当然也可以用下面的命令来

  • 在Shell命令行处理JSON数据的方法

    因为最近要处理一些 JSON 数据格式,所以在经过一番搜索后 最终找到了 jq 这个很棒的工具.jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等. 让我们通过几个例子来说明 jq 的功能: 一.输出格式化,漂亮的打印效果 如果我们用文本编辑器打开 JSON,有时候可能看起来会一团糟,但是通过 jq 的 .(点)过滤器就可以立马让 JSON 的格式规整起来. 1.用文本编辑器打开后的样子 2.用 jq 显示的结果 复制代码 代码如下: % jq . soundtag.js

  • linux shell脚本学习xargs命令使用详解

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具.它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理.通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据.xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代. xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子. 1.

  • 提高你工作效率的shell命令总结大全

    前言 大家都知道Shell是一个用C语言编写的程序,它是用户使用 Linux 的桥梁.Shell就是一个命令行解释器,它的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive).下面这篇文章主要给大家分享了一些关于提高工作效率的shell命令,话不多说,来一起看看详细的介绍: 一.切换目录 注意:当前用户是xiaochao,系统为centos6,并且,shell命令是严格区分大小写的. 显示当前目录路径:pwd pwd output:/

随机推荐