2019-06-04 15:35:21 u014472548 阅读数 397
  • 玩转Linux:常用命令实例指南

    本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通 。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 注意: 1、本课程原价99元,现在仅需29元!购课就送5门价值300元的编程课! 2、购课后登陆csdn学院官网,在课程目录页面即可下载课件。 学完即可轻松应对工作中 85% 以上的 Linux 使用场景 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本课程【现在享受秒杀价39元】 3)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 注意: 1)现在购买至少享受60元优惠; 2)购课后添加微信eduxy-1,发送订单截图领取300元编程礼包。 --------------------------------------------------------------- 这门课程,绝对不会让你觉得亏! 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+300元编程礼包。   人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。   在这门课中,我们保证你能收获到这些 1)快速掌握 Linux 常用命令及配置 2)Linux核心知识点 3) 文件、进程、磁盘、用户管理,以及网络工具命令、文件传输等 4)Vi/Vim编辑器用法  

    7034 人正在学习 去看看 良许

Linux中的Configure选项配置参数详解

Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后在安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。Configure脚本配置工具就是基础之一,它是autoconf的工具的基本应用。

与一些技巧相比,Configure显得基础一些,当然使用和学习起来就显得枯燥乏味一些,当然要成为高手,对基础的熟悉不能超越哦。

为此我转载了一篇关于Configure选项配置的详细介绍。供大家参考’configure’脚本有大量的命令行选项.对不同的软件包来说,这些选项可能会有变化,但是许多基本的选项是不会改变的.带上’–help’ 选项执行’configure’脚本可以看到可用的所有选项.尽管许多选项是很少用到的,但是当你为了特殊的需求而configure一个包时,知道他们的存在是很有益处的.

下面对每一个选项进行简略的介绍:

–cache-file=FILE
‘configure’会在你的系统上测试存在的特性(或者bug!).为了加速随后进行的配置,测试的结果会存储在一个cache file里.当configure一个每个子树里都有’configure’脚本的复杂的源码树时,一个很好的cache file的存在会有很大帮助.

–help
输出帮助信息.即使是有经验的用户也偶尔需要使用使用’–help’选项,因为一个复杂的项目会包含附加的选项.例如,GCC包里的’configure’脚本就包含了允许你控制是否生成和在GCC中使用GNU汇编器的选项.

–no-create
‘configure’中的一个主要函数会制作输出文件.此选项阻止‘configure’生成这个文件.你可以认为这是一种演习(dry run),尽管缓存(cache)仍然被改写了.

–quiet
–silent

当’configure’进行他的测试时,会输出简要的信息来告诉用户正在作什么.这样作是因为’configure’可能会比较慢,没有这种输出的话用户将会被扔在一旁疑惑正在发生什么.使用这两个选项中的任何一个都会把你扔到一旁.(译注:这两句话比较有意思,原文是这样的:If there was no such output, the user would be left wondering what is happening. By using this option, you too can be left wondering!)

–version
打印用来产生’configure’脚本的Autoconf的版本号.

–prefix=preFIX(文件安装的位置)
‘–prefix’是最常用的选项.制作出的’Makefile’会查看随此选项传递的参数,当一个包在安装时可以彻底的重新安置他的结构独立部分. 举一个例子,当安装一个包,例如说Emacs,下面的命令将会使Emacs Lisp file被安装到”/opt/gnu/share”:
$ ./configure –prefix=/opt/gnu/share

–exec-prefix=EPREFIX
与’–prefix’选项类似,但是他是用来设置结构倚赖的文件的安装位置.编译好的’emacs’二进制文件就是这样一个文件.如果没有设置这个选项的话,默认使用的选项值将被设为和’–prefix’选项值一样.

–bindir=DIR
指定二进制文件的安装位置.这里的二进制文件定义为可以被用户直接执行的程序.

—sbindir=DIR
指定超级二进制文件的安装位置.这是一些通常只能由超级用户执行的程序.

–libexecdir=DIR(包目录,程序调用)
指定可执行支持文件的安装位置.与二进制文件相反,这些文件从来不直接由用户执行,但是可以被上面提到的二进制文件所执行.

–datadir=DIR
指定通用数据文件的安装位置.

–sysconfdir=DIR(/etc配置文件目录)
指定在单个机器上使用的只读数据的安装位置.

–sharedstatedir=DIR
指定可以在多个机器上共享的可写数据的安装位置.

–localstatedir=DIR
指定只能单机使用的可写数据的安装位置.

–libdir=DIR(库文件目录)
指定库文件的安装位置.

–includedir=DIR
指定C头文件的安装位置.其他语言如C++的头文件也可以使用此选项.

–oldincludedir=DIR
指定为除GCC外编译器安装的C头文件的安装位置.

–infodir=DIR
指定Info格式文档的安装位置.Info是被GNU工程所使用的文档格式.

–mandir=DIR(帮助文档的安装目录)
指定手册页的安装位置.

–srcdir=DIR
这个选项对安装没有作用.他会告诉’configure’源码的位置.一般来说不用指定此选项,因为’configure’脚本一般和源码文件在同一个目录下.

–program-prefix=PREFIX
指定将被加到所安装程序的名字上的前缀.例如,使用’–program-prefix=g’来configure一个名为’tar’的程序将会使安装的程序被命名为’gtar’.当和其他的安装选项一起使用时,这个选项只有当他被`Makefile.in’文件使用时才会工作.

–program-suffix=SUFFIX
指定将被加到所安装程序的名字上的后缀.

–program-transform-name=PROGRAM
这里的PROGRAM是一个sed脚本.当一个程序被安装时,他的名字将经过`sed -e PROGRAM’来产生安装的名字.

–build=BUILD
指定软件包安装的系统平台.如果没有指定,默认值将是’–host’选项的值.

–host=HOST
指定软件运行的系统平台.如果没有指定,将会运行`config.guess’来检测.

–target=GARGET
指定软件面向(target to)的系统平台.这主要在程序语言工具如编译器和汇编器上下文中起作用.如果没有指定,默认将使用’–host’选项的值.

–disable-FEATURE
一些软件包可以选择这个选项来提供为大型选项的编译时配置,例如使用Kerberos认证系统或者一个实验性的编译器最优配置.如果默认是提供这些特性,可以使用’–disable-FEATURE’来禁用它,这里’FEATURE’是特性的名字.例如:

$ ./configure –disable-gui

-enable-FEATURE[=ARG](系统参数配置,在编译时完成)
相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用’–enable-FEATURE’来起用它.这里’FEATURE’是特性的名字.一个特性可能会接受一个可选的参数.例如:

$ ./configure –enable-buffers=128


`–enable-FEATURE=no’与上面提到的’–disable-FEATURE’是同义的.

–with-PACKAGE[=ARG]
在自由软件社区里,有使用已有软件包和库的优秀传统.当用’configure’来配置一个源码树时,可以提供其他已经安装的软件包的信息.例如,倚赖于Tcl和Tk的BLT器件工具包.要配置BLT,可能需要给’configure’提供一些关于我们把Tcl和Tk装的何处的信息:

代码如下:

$ ./configure –with-tcl=/usr/local –with-tk=/usr/local
‘–with-PACKAGE=no’与下面将提到的’–without-PACKAGE’是同义的.

–without-PACKAGE
有时候你可能不想让你的软件包与系统已有的软
件包交互.例如,你可能不想让你的新编译器使用GNU ld.通过使用这个选项可以做到这一点:

$ ./configure –without-gnu-ld

–x-includes=DIR
这个选项是’–with-PACKAGE’选项的一个特例.在Autoconf最初被开发出来时,流行使用’configure’来作为Imake 的一个变通方法来制作运行于X的软件.’–x-includes’选项提供了向’configure’脚本指明包含X11头文件的目录的方法.

–x-libraries=DIR
类似的,’–x-libraries’选项提供了向’configure’脚本指明包含X11库的目录的方法.

 

建议使用三棵树:一棵源码树(source tree),一棵构筑树(build tree),一棵安装树(install tree).

例子,是使用这种方法来构筑GNU malloc包:

代码如下:

$ gtar zxf mmalloc-1.0.tar.gz
$ mkdir build && cd build
$ ../mmalloc-1.0/configure
creating cache ./config.cache
checking for gcc… gcc
checking whether the C compiler (gcc ) works… yes
checking whether the C compiler (gcc ) is a cross-compiler… no
checking whether we are using GNU C… yes
checking whether gcc accepts -g… yes
checking for a BSD compatible install… /usr/bin/install -c
checking host system type… i586-pc-linux-gnu
checking build system type… i586-pc-linux-gnu
checking for ar… ar
checking for ranlib… ranlib
checking how to run the C preprocessor… gcc -E
checking for unistd.h… yes
checking for getpagesize… yes
checking for working mmap… yes
checking for limits.h… yes
checking for stddef.h… yes
updating cache ../config.cache
creating ./config.status


这样这棵构筑树就被配置了,下面可以继续构筑和安装这个包到默认的位置’/usr/local':

$ make all && make install

 

2019-02-27 21:34:35 meteorsshower2013 阅读数 161
  • 玩转Linux:常用命令实例指南

    本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通 。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 注意: 1、本课程原价99元,现在仅需29元!购课就送5门价值300元的编程课! 2、购课后登陆csdn学院官网,在课程目录页面即可下载课件。 学完即可轻松应对工作中 85% 以上的 Linux 使用场景 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本课程【现在享受秒杀价39元】 3)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 注意: 1)现在购买至少享受60元优惠; 2)购课后添加微信eduxy-1,发送订单截图领取300元编程礼包。 --------------------------------------------------------------- 这门课程,绝对不会让你觉得亏! 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+300元编程礼包。   人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。   在这门课中,我们保证你能收获到这些 1)快速掌握 Linux 常用命令及配置 2)Linux核心知识点 3) 文件、进程、磁盘、用户管理,以及网络工具命令、文件传输等 4)Vi/Vim编辑器用法  

    7034 人正在学习 去看看 良许

在Linux中,文件的命名可以为-f.
假设我们要删除这个文件。使用rm -f,那么程序可能把-f文件对象参数当做了命令选项参数,导致文件无法被删除
如下:我们用vi创建了一个文件名为-i的文件,使用rm -i 无法删除此文件
在这里插入图片描述

解决

许多Linux命令(如cp, ls, mv, rm, cat, grep, set等) 用–显式地标志命令行选项的结束 ,识别以-开头的处理对象。

例如:
在这里插入图片描述

参考:蒋砚军高占春《实用UNIX教程》

2018-07-24 23:54:37 u011285208 阅读数 1078
  • 玩转Linux:常用命令实例指南

    本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通 。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 注意: 1、本课程原价99元,现在仅需29元!购课就送5门价值300元的编程课! 2、购课后登陆csdn学院官网,在课程目录页面即可下载课件。 学完即可轻松应对工作中 85% 以上的 Linux 使用场景 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本课程【现在享受秒杀价39元】 3)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 注意: 1)现在购买至少享受60元优惠; 2)购课后添加微信eduxy-1,发送订单截图领取300元编程礼包。 --------------------------------------------------------------- 这门课程,绝对不会让你觉得亏! 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+300元编程礼包。   人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。   在这门课中,我们保证你能收获到这些 1)快速掌握 Linux 常用命令及配置 2)Linux核心知识点 3) 文件、进程、磁盘、用户管理,以及网络工具命令、文件传输等 4)Vi/Vim编辑器用法  

    7034 人正在学习 去看看 良许

 

目录

 

简介

1. 手工处理选项和参数

2. 使用 getopts 处理多命令行选项

3. 使用 getopt 处理多命令行选项


简介

本文介绍了linux shell中使用命令行选项与命令行参数的方法,在bash中,可以用以下三种方式来处理命令行参数,每种方式都有自己的应用场景。

1,直接处理,依次对$1,$2,...,$n进行解析,分别手工处理;

2,getopts来处理,单个字符选项的情况(如:-n 10 -f file.txt等选项);

3,getopt,可以处理单个字符选项,也可以处理长选项long-option(如:--prefix=/home等)。
总结:小脚本手工处理即可,getopts能处理绝大多数的情况,getopt较复杂、功能也更强大。

1. 手工处理选项和参数

当我们编写的 Shell 脚本只接收少量命令行选项时,且已知选项和参数位置格式,使用 case 语句对其进行处理是比较方便的。下面是一个简单的使用示例

#! /bin/bash

# 将第一个命令行参数赋值给变量 opt
opt=$1
# 将第二个命令行参数赋值给变量 filename
filename=$2

# 定义函数 checkfile
checkfile() {
        # 如果没有指定文件名,则显示缺少文件名,并退出脚本的运行
        if [ -z $filename ]
        then
                echo "File name missing"
                exit 1
        elif [ ! -f $filename ]
        then
                echo "The file $filename doesn't exist!"
                exit 2
        fi
}

case $opt in
        -e|-E)
                checkfile
                echo "Editing $filename file..."
                ;;
        -p|-P)
                checkfile
                echo "Displaying $filename file..."
                ;;
        *)
                echo "Bad argument!"
                echo "Usage: `basename $0` -e|-p filename"
                echo "          -e filename : Edit file."
                echo "          -f filename : Display file."
                ;;
esac

处理过程中,一下shell内置参数命令如下:

*    $0 :即命令本身,相当于c/c++中的argv[0]
*    $1 :第一个参数.
*    $2, $3, $4 ... :第2、3、4个参数,依次类推。
*    $#  参数的个数,不包括命令本身
*    $@ :参数本身的列表,也不包括命令本身
*    $* :和$@相同,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分。举例如下:
    Listing args with"$*":
    Arg #1=1 2 3 4
    所有的参数被认为是一个单词

    Listing args with "$@":
    Arg #1=1
    Arg #2=2
    Arg #3=3
    Arg #4=4
    所有的参数被认为是各个独立的单词

    Listing args with $* (未被引用):
    Arg #1=1
    Arg #2=2
    Arg #3=3
    Arg #4=4

2. 使用 getopts 处理多命令行选项

getopts 的特点:

  • 我们不需要通过外部程序来处理位置参数;
  • getopts 可以容易地设置我们可以用来解析的 Shell 变量(这对于一个外部进程是不可能的);
  • getopts 定义在 POSIX 中。
  • 只处理短选项

getopts 会识别所有这些选项格式,指定的选项可以是大写或小写字母,或是数字。虽然它也能识别其他字符,但是不推荐使用。通常情况下,在处理命令行选项和参数时,我们需要多次调用 getopts。getopts 本身不会更改位置参数的设置,如果我们想要将位置参数移位,必须仍使用 shift 命令来处理位置参数。因为当没有内容可以解析时,getopts 会设置一个退出状态 FALSE,所以它很容易在 while 循环中使用:

while getopts ...; do
...
done

 

getopts 将解析选项和它们可能的参数。它将在第一个非选项参数(不以连字符“-”开头的,且不是它前面的任何选项的参数的字符串)的位置停止解析。当遇到双连字符“--”(表示选项的结束)时,它也将停止解析。

getopts 会使用到如下 3 个变量:

  • OPTIND:存放下一个要处理的参数的索引。这是 getopts 在调用过程中记住自己状态的方式。同样可以用于移位使用 getopts 处理后的位置参数。OPTIND 初始被设置为 1,并且如果你想再次使用 getopts 解析任何内容,都需要将其重置为 1;
  • OPTARG:这个变量被设置为由 getopts 找到的选项所对应的参数;
  • OPTERR:它的值为 0 或者 1。指示 Bash 是否应该显示由 getopts 产生的错误信息。在每个 Shell 启动时,它的值都被初始化为 1。如果我们不想看到烦人的信息,可以将它的值设置为 0。

getopts 命令的基本语法:

getopts OPTSTRING VARNAME [ARGS...]
  • OPTSTRING:告诉 getopts 会有哪些选项和在哪会有参数;
  • VARNAME:告诉 getopts 哪个变量用于选项报告;
  • ARGS:告诉 getopts 解析这些可选的参数,而不是位置参数。

例如,如下的命令告诉 getopts 查找 -f、-A 和 -x 选项:

getopts fAx VARNAME

而下面的命令告诉 getopts -A 选项后面会有一个参数:

getopts fA:x VARNAME

默认情况下 getopts 命令是解析当前 Shell 或函数的位置参数。我们可以指定自己的参数让 getopts 来解析。一旦额外的参数指定在了 VARNAME 之后,getopts 将不再尝试解析位置参数,而是解析这些额外指定的参数。

getopts 命令还支持两种错误报告的模式,分别为:详细错误报告模式和抑制错误报告模式。对于产品中的脚本,推荐使用抑制错误报告模式,因为这样看起来更专业,不会看到恼人的标准信息。同样它也更容易处理,因为我们以更简单的方法显示了失败的情况。

在详细错误报告模式下,如果 getopts 遇到了一个无效的选项,VARNAME 的值会被设置为问号(?),并且变量 OPTARG 不会被设置;如果需要的参数没有找到,VARNAME 的值同样会被设置为问号(?),变量 OPTARG 也不会被设置,并且会打印一个错误信息。

在抑制错误报告模式下,如果 getopts 遇到了一个无效的选项,VARNAME 的值会被设置为问号(?),并且变量 OPTARG 会被设置为选项字符;如果需要的参数没找到,VARNAME 的值同样会被设置为冒号(:),并且变量 OPTARG 中会包含选项字符。

#安全CP实现
while getopts ":adpfiRr" opt
do
    case $opt in
        a)
            echo "option a"
            exit 
            ;;
    esac
    case $opt in
        ?)
            ;;
    esac
done

#移动到参数位置
shift $[ $OPTIND -1  ]    

#处理参数
while [ $# -gt 1 ]
do
    src="${src} $1"
    shift 
done
dst=$1

3. 使用 getopt 处理多命令行选项

getopt 命令与 getopts 的功能很相似,也是用于解析命令行的选项和参数,使其可以被 Shell 程序简单地解析。不同的是,getopt 命令是 Linux 下的命令行工具,并且 getopt 支持命令行的长选项(比如,--some-option)。另外,在脚本中它们的调用方式也不同。getopt 的语法类似如下:

getopt [options] [--] optstring parameters
getopt [options] -o|--options optstring [options] [--] parameters

下面是一个示例:

$ getopt f:vl -vl -f/local/filename.conf param_1
-v -l -f /local/filename.conf -- param_1

上例中,“f:vl” 对应 getopt 命令语法中的 optstring(选项字符串),“-vl -f/local/filename.conf param_1” 对应 getopt 命令语法中的 parameters(getopt 命令的参数)。因此,getopt 会按照 optstring 的设置,将 parameters 解析为相应的选项和参数。所以,“-vl” 被解析为了 “-v” 和 “-l”。与 getopts 类似,因为在选项字符串中 “f” 后有一个冒号(:),所以 “-f/local/filename.conf” 被解析为 “-f /local/filename.conf”。然后解析后的命令行选项和参数之间使用双连字符(--)分隔

tgt_flag=false

#增加了eval后,选项参数可用,否则参数为‘param’形式
eval set -- `getopt -o t:S:Z:: -l target:,backup::,suffix:,preserve::,reflink::,sparse:,no-preserve:,context:: -- "$@" 2>/dev/null`>/dev/null 2>&1 

while [ $# -gt 0 ]
do
	case $1 in
		-t|--target)
			tgt_flag=true
			dst=$2
			shift 2
			;;
			#必接参数的,偏移2位
			-S|--no-preserve|--sparse|--suffix)
			shift 2
			;;
		?)
			shift
			;;
#--表示选项结束,剩下的是参数。
		--)
			shift
			break
			;;
	esac
done

if ${tgt_flag}
then
	src=$*
else
	while [ $# -gt 1 ]
	do
		src="${src} $1"
		shift 
	done
	dst=$1
fi

 

getopt 命令遵循如下规则:

  • 每一个字符代表一个选项;
  • 字符后跟一个冒号(:)表示选项需要一个参数;
  • 字符后跟两个冒号(::)表示选项有个可选参数。
  • -o表示短选项,两个冒号表示该选项有一个可选参数,可选参数必须紧贴选项,如-carg 而不能是-c arg
  • -l 或者 --long表示长选项
  • 命令行选项和参数之间使用双连字符(--)分隔。
  • man getopt

 

 

 

 

2018-01-15 19:45:33 qq_32595075 阅读数 1201
  • 玩转Linux:常用命令实例指南

    本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通 。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 注意: 1、本课程原价99元,现在仅需29元!购课就送5门价值300元的编程课! 2、购课后登陆csdn学院官网,在课程目录页面即可下载课件。 学完即可轻松应对工作中 85% 以上的 Linux 使用场景 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本课程【现在享受秒杀价39元】 3)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 注意: 1)现在购买至少享受60元优惠; 2)购课后添加微信eduxy-1,发送订单截图领取300元编程礼包。 --------------------------------------------------------------- 这门课程,绝对不会让你觉得亏! 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+300元编程礼包。   人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。   在这门课中,我们保证你能收获到这些 1)快速掌握 Linux 常用命令及配置 2)Linux核心知识点 3) 文件、进程、磁盘、用户管理,以及网络工具命令、文件传输等 4)Vi/Vim编辑器用法  

    7034 人正在学习 去看看 良许

登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着“选项”(英文options)或“参数”(英文arguments)。即Linux中命令格式为:

command [options] [arguments] //中括号代表是可选的,即有些命令不需要选项也不需要参数,但有的命令在运行时需要多个选项或参数。

选项options:

选项是调整命令执行行为的开关,即,选项不同决定了命令的显示结果不同。

选项分为长选项和短选项。

短选项:比如-h,-l,-s等。(-   后面接单个字母)

  l短选项都是使用‘-’引导,当有多个短选项时,各选项之间使用空格隔开。

  l有些命令的短选项可以组合,比如-l –h 可以组合为–lh

  l有些命令的短选项可以不带-,这通常叫作BSD风格的选项,比如ps aux

  l有些短选项需要带选项本身的参数,比如-L 512M

长选项:比如--help,--list等。(--  后面接单词)

  l长选面都是完整的单词

  l长选项通常不能组合

  l如果需要参数,长选项的参数通常需要‘=’,比如--size=1G

参数arguments:

  参数是指命令的作用对象。

  如ls命令,不加参数的时候显示是当前目录,也可以加参数,如ls /dev, 则输出结果是/dev目录。

  以上简要说明了选项及参数的区别,但具体Linux中哪条命令有哪些选项及参数,需要我们靠经验积累或者查看Linux的帮助了。

 

总结:

  选项是限定结果的显示结果  

    短选项(-  一个横杠):只能修饰一个字符的选项,比如: ls -a,当然多个短选项可以合并,比如tar -cvf

    长选项(--  两个横杠):可以修饰单个字符,也可以修饰一个单词,比如:(1) chkconfig --list   (2)chkconfig --add xxx  (3)service --status-all

  参数是传递到脚本中的真实的参数

 

 

第二种理解:

本文介绍了linux shell中使用命令行选项与命令行参数的方法,在bash中,可以用以下三种方式来处理命令

行参数,每种方式都有自己的应用场景
问题描述:在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  
复制代码

 

 

 



运行命令:
代码如下:

1
2
3
4
5
6
./getopt.sh --b-long abc -a -c33 remain 
option b, argument `abc' 
option a 
option c, argument `33' 
remaining arguments: 
--> `remain'

  

 

 

转载自:https://www.cnblogs.com/qlqwjy/p/7787156.html

2016-12-05 21:11:43 csdn__lc 阅读数 529
  • 玩转Linux:常用命令实例指南

    本课程以简洁易懂的语言手把手教你系统掌握日常所需的Linux知识,每个知识点都会配合案例实战让你融汇贯通 。课程通俗易懂,简洁流畅,适合0基础以及对Linux掌握不熟练的人学习; 注意: 1、本课程原价99元,现在仅需29元!购课就送5门价值300元的编程课! 2、购课后登陆csdn学院官网,在课程目录页面即可下载课件。 学完即可轻松应对工作中 85% 以上的 Linux 使用场景 【限时福利】 1)购课后按提示添加小助手,进答疑群,还可获得价值300元的编程大礼包! 2)本课程【现在享受秒杀价39元】 3)本月购买此套餐加入老师答疑交流群,可参加老师的免费分享活动,学习最新技术项目经验。 注意: 1)现在购买至少享受60元优惠; 2)购课后添加微信eduxy-1,发送订单截图领取300元编程礼包。 --------------------------------------------------------------- 这门课程,绝对不会让你觉得亏! 29元=掌握Linux必修知识+社群答疑+讲师社群分享会+300元编程礼包。   人工智能、物联网、大数据时代,Linux正有着一统天下的趋势,几乎每个程序员岗位,都要求掌握Linux。本课程零基础也能轻松入门。   在这门课中,我们保证你能收获到这些 1)快速掌握 Linux 常用命令及配置 2)Linux核心知识点 3) 文件、进程、磁盘、用户管理,以及网络工具命令、文件传输等 4)Vi/Vim编辑器用法  

    7034 人正在学习 去看看 良许

[root@web ffmpeg]# ./configure --help
Usage: configure [options]
Options: [defaults in brackets after descriptions]

Standard options:   基本选项参数
  --help                   显示此帮助信息|print this message
  --log[=FILE|yes|no]      记录测试并输出到config.err文件|log tests and output to FILE [config.err]
  --prefix=PREFIX          安装程序到指定目录(默认/usr/local)|install in PREFIX [/usr/local]
  --libdir=DIR             安装库到指定目录(默认prefix/lib)|install libs in DIR [PREFIX/lib]
  --shlibdir=DIR           指定共享库路径(默认prefix/lib)|install shared libs in DIR [PREFIX/lib]
  --incdir=DIR             指定includes路径(默认prefix/include/ffmpeg)|install includes in DIR[PREFIX/include/ffmpeg]
  --mandir=DIR             指定man page路径(默认prefix/man)install man page in DIR [PREFIX/man]
  --enable-mp3lame         启用mp3编码libmp3lame(默认关闭)enable MP3 encoding via libmp3lame[default=no]
  --enable-libogg          启用ogg支持libogg(默认关闭)enable Ogg support via libogg [default=no]
  --enable-vorbis          启用Vorbis支持libvorbis(默认关闭)enable Vorbis support via libvorbis [default=no]
  --enable-faad            启用faad支持libfaad(默认关闭)enable FAAD support via libfaad [default=no]
  --enable-faadbin         启用faad运行时链接支持(默认关闭)build FAAD support with runtime linking[default=no]
  --enable-faac            启用faac支持libfaac(默认关闭)enable FAAC support via libfaac [default=no]
  --enable-libgsm          启用GSM支持libgsm(默认关闭)enable GSM support via libgsm [default=no]
  --enable-xvid            启用xvid支持xvidcore(默认关闭)enable XviD support via xvidcore [default=no]
  --enable-x264            启用H.264编码(默认关闭)enable H.264 encoding via x264 [default=no]
  --enable-mingw32         启用MinGW本地/交叉win环境编译|enable MinGW native/cross Windows compile
  --enable-mingwce         启用MinGW本地/交叉winCE环境编译enable MinGW native/cross WinCE compile
  --enable-a52             启用A52支持(默认关闭)enable GPLed A52 support [default=no]
  --enable-a52bin          启用运行时打开liba52.so.0(默认关闭)open liba52.so.0 at runtime [default=no]
  --enable-dts             启用DTS支持(默认关闭)enable GPLed DTS support [default=no]
  --enable-pp              启用后加工支持(默认关闭)enable GPLed postprocessing support [default=no]
  --enable-static          构建静态库(默认启用)build static libraries [default=yes]
  --disable-static         禁止构建静态库(默认关闭)do not build static libraries [default=no]
  --enable-shared          构建共享库(默认关闭)build shared libraries [default=no]
  --disable-shared         禁止构建共享库(默认启用)do not build shared libraries [default=yes]
  --enable-amr_nb          启用amr_nb float音频编解码器|enable amr_nb float audio codec
  --enable-amr_nb-fixed    启用fixed amr_nb codec | use fixed point for amr-nb codec
  --enable-amr_wb          启用amr_wb float音频编解码器|enable amr_wb float audio codec
  --enable-amr_if2         启用amr_wb IF2音频编解码器|enable amr_wb IF2 audio codec
  --enable-sunmlib         启用Sun medialib(默认关闭) | use Sun medialib [default=no]
  --enable-pthreads        启用pthreads(多线程)(默认关闭)use pthreads [default=no]
  --enable-dc1394          启用libdc1394、libraw1394抓取IIDC-1394(默认关闭)enable IIDC-1394 grabbing using libdc1394 and libraw1394 [default=no]
  --enable-swscaler        启用计数器支持?(默认关闭)software scaler support [default=no]
  --enable-avisynth        允许读取AVISynth脚本本件(默认关闭)allow reading AVISynth script files [default=no]
  --enable-gpl             允许使用GPL(默认关闭)allow use of GPL code, the resulting libav* and ffmpeg will be under GPL [default=no]

Advanced options (experts only): 高级选项参数(供专业人员使用)
  --source-path=PATH       源码的路径(当前为/root/flv/ffmpeg)| path to source code [/root/flv/ffmpeg]
  --cross-prefix=PREFIX    为编译工具指定路径 | use PREFIX for compilation tools []
  --cross-compile          假定使用了交叉编译 | assume a cross-compiler is used
  --cc=CC                  指定使用何种C编译器(默认gcc)use C compiler CC [gcc]
  --make=MAKE              使用特定的make | use specified make [make]
  --extra-cflags=ECFLAGS   添加ECFLAGS到CFLAGS | add ECFLAGS to CFLAGS []
  --extra-ldflags=ELDFLAGS 添加ELDFLAGS到LDFLAGS(默认-Wl,--as-needed)| add ELDFLAGS to LDFLAGS [ -Wl,--as-needed]
  --extra-libs=ELIBS       添加ELIBS | add ELIBS []
  --build-suffix=SUFFIX    为专用程序添加后缀 | suffix for application specific build []
  --arch=ARCH              选择机器架构(默认x86)select architecture  [x86]
  --cpu=CPU                选用最低的cpu(影响指令的选择,可以在老CPU上出错) | selects the minimum cpu required (affects instruction selection, may crash on older CPUs)
  --powerpc-perf-enable    启用PPC上面的性能报告(需要启用PMC)enable performance report on PPC
                           (requires enabling PMC)
  --disable-mmx            禁用MMX | disable MMX usage
  --disable-armv5te        禁用armv5te | disable armv5te usage
  --disable-iwmmxt         禁用iwmmxt | disable iwmmxt usage
  --disable-altivec        禁用AltiVec | disable AltiVec usage
  --disable-audio-oss      禁用OSS音频支持(默认启用)disable OSS audio support [default=no]
  --disable-audio-beos     禁用BeOS音频支持(默认启用)disable BeOS audio support [default=no]
  --disable-v4l            禁用video4linux提取(默认启用)disable video4linux grabbing [default=no]
  --disable-v4l2           禁用video4linux2提取(默认启用)disable video4linux2 grabbing [default=no]
  --disable-bktr           禁用bktr视频提取(默认启用)disable bktr video grabbing [default=no]
  --disable-dv1394         禁用DV1394提取(默认启用)disable DV1394 grabbing [default=no]
  --disable-network        禁用网络支持(默认支持)disable network support [default=no]
  --disable-ipv6           禁用ipv6支持(默认支持)disable ipv6 support [default=no]
  --disable-zlib           禁用zlib(默认支持)disable zlib [default=no]
  --disable-simple_idct    禁用simple IDCT例程(默认启用)disable simple IDCT routines [default=no]
  --disable-vhook          禁用video hooking支持 | disable video hooking support
  --enable-gprof           enable profiling with gprof [no]
  --disable-debug          禁用调试符号 | disable debugging symbols
  --disable-opts           禁用编译器最优化 | disable compiler optimizations
  --disable-mpegaudio-hp   启用更快的解码MPEG音频(但精确度较低)(默认禁用)faster (but less accurate) MPEG audio decoding [default=no]
  --disable-protocols      禁用 I/O 协议支持(默认启用)disable I/O protocols support [default=no]
  --disable-ffserver       禁用生成ffserver | disable ffserver build
  --disable-ffplay         禁用生成ffplay | disable ffplay build
  --enable-small           启用优化文件尺寸大小(牺牲速度)optimize for size instead of speed
  --enable-memalign-hack   启用模拟内存排列,由内存调试器干涉? | emulate memalign, interferes with memory debuggers
  --disable-strip          禁用剥离可执行程序和共享库 | disable stripping of executables and shared libraries
  --disable-encoder=NAME   禁用XX编码器 | disables encoder NAME
  --enable-encoder=NAME    启用XX编码器 | enables encoder NAME
  --disable-decoder=NAME   禁用XX解码器 | disables decoder NAME
  --enable-decoder=NAME    启用XX解码器 | enables decoder NAME
  --disable-encoders       禁用所有编码器 | disables all encoders
  --disable-decoders       禁用所有解码器 | disables all decoders
  --disable-muxer=NAME     禁用XX混音器 | disables muxer NAME
  --enable-muxer=NAME      启用XX混音器 | enables muxer NAME
  --disable-muxers         禁用所有混音器 | disables all muxers
  --disable-demuxer=NAME   禁用XX解轨器 | disables demuxer NAME
  --enable-demuxer=NAME    启用XX解轨器 | enables demuxer NAME
  --disable-demuxers       禁用所有解轨器 | disables all demuxers
  --enable-parser=NAME     启用XX剖析器 | enables parser NAME
  --disable-parser=NAME    禁用XX剖析器 | disables parser NAME
  --disable-parsers        禁用所有剖析器 | disables all parsers

没有更多推荐了,返回首页