Shell脚本中参数传递方法常用有8种

Shell脚本中参数传递方法常用有8种

1. $# 传递到脚本的参数个数

2. $* 以一个单字符串显示所有向脚本传递的参数变量。与位置变量不同,此选项参数可超过9个

3. $$ 脚本运行的当前进程ID号

4. $! 后台运行的最后一个进程的进程ID号

5. $@ 与$#相同,但是使用时加引号,并在引号中返回每个参数

6. $- 显示shell使用的当前选项,与set命令功能相同

7. $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

8. $()里面放命令,可以在脚本中执行该命令,并返回命令执行的输出

下面给各位深入分析

1、命令行参数

向shell脚本传递数据的最基本方式是使用命令行参数。

(1) 读取参数

读取输入的参数的变量为位置参数,位置参数通过标准数字表示,

其中$0为程序名称,$1为第一个参数,$2为第二个参数,依次类推,直到$9为第九个参数。

shell脚本自动将命令行参数赋值给各个位置变量。

同时输入多个参数(可以是数值也可以是字符串)时,必须使用空 格分隔(要想在参数值中包含空格,就必须使用单引号或双引号)

当参数多于9个后,必须在shell脚本内使用大括号将变量括起来,如${10}。从而可以使用任意个参数。

(2)读取程序名称

传递给变量$0的字符串实际上是程序的路径(根据调用方法决定是相对还是绝对路径)。

使用basename命令可以去掉路径前缀,只获得程序名称(名字中不 可以有空格)。

(3)测试脚本

当脚本认为应该包含参数,却实际上没有数据时,就会出错。

好的方法是 对参数进行检查来保证使用参数前确实存在数据,可以使用-n参数来检查。

ex: if [ –n “$1” ] then .. else .. fi

 

2、特殊的参数变量

用于跟踪命令行参数

(1)参数计数

使用特殊变量$#测试执行脚本时包含的命令行参 数个数。脚本中任何位置都可以使用$#

ex: if [ $# –ne 2 ] 即可测试参数个数

可 以使用${!#}来返回最后一个命令行参数(当无参数时,$#为0, 而${!#}为程序名)

(2)获取所有数据

变量$*将命令行中提供的所有参数作为一个单词处理,它将多个参数看成 一个参数。

变量$@将命令行中提供的所 有参数作为同一个字符串中的多个单词处理。允许对其中的值进行迭代(一般使用for),分隔开不同参数

 3、 移位

shift命 令能够改变命令行参数的相对位置。默认将每个参数变量左移一个位置(变量$0不变,把$1丢弃,注意 不可以恢复了!)

在不清楚参数数目情况下,这是一个迭代参数的好办法。

可 以为shift提供一个参数,来实现多位移变化。

 4、处理选项

选项是由破折号 引导的单个字母,用于更改命令的行为。

(1)找出选项

1)处理简单选项

可以使用处理命令行参数相同的方法处理选项,抽取时使用case 语句进行判断是否符合选项格式。

2)从参数中分离选项

同 时使用选项和参数时,可以使用--指示选项列表的结束。发现--后,shell就知道后面的是普通参数了,停止使用case处理选项。

3) 处理带值的选项

选项后紧跟参数值,一种方法是在case中对应选项后使用shift和读后一位参数的 方法处理。更好的方法如下:

(2)使用getopt命 令

getopt命令在处理选项和参数时 非常方便。它对参数进行重新组织,以便于解析

1)命令格式

getopt可以接受任意 形式的选项和参数列表,并自动将它们转换为适当的格式。

命令格式为: getopt options optstring parameters

选项字符串(opstring)用于定义命令行 中的有效选项字母,以及哪些选项字母需要参数值。

2)脚本中使用getopt

需要使用set命令将现有的 命令行选项和参数替换为getopt命令生成的格式化形式。

需要将原始脚本命令行参数送给getopt命令,然后将 getopt命令输出送给set命令,如下:set – `getopts –q ab:cd “$@”`

但 是getopt命令不能很好的处理带有空格的参数值,它将空格解析为参数分隔符,而不是将双引号引起来的两个值合并成一个参数。解决办 法如下:

(3)更高级的getopts命令

getopts命令顺序的对现有的shell参数变量进行处理, 每调用一次,只处理命令中检测到的参数中的一个。处理完所有参数后,以大于0的退出状态退出。

非常适宜于在循环中解析所 有命令行参数

格式为: getopts optstring variable

$OPTARG包含需 要参数值的选项要使用的值,$OPTIND包含getopts停止处理时在参数列表中的位置。

注意:当getopts处 理时,会将选项前的-去掉,所以对应的case中不需要破折号。

好的特性:

1)可以在参数值中包含空 格

2)选项字母和参数值中间可以没有空格

3)将在命令行中找到的未定义的选项都绑定为单一的输出——问号

 5、标准化选项

有一些字母选项具有标准含义。最好按照标准含义定义选项意义

-a –c –d –e –f –h –i –l –n –o –q –r –s –v- x –y

 6、获取用户输入

当需要在执 行过程中获得执行脚本人员的输入,使用read命 令

(1)基本读取

read命 令接受标准输入或其他文件描述符输入。读入后将数据放入一个标准变量中。

-p 允许在read命令行中直接指定一个提示。

可以指定多个变量,也可以不指定(将放置在REPLY环境变量中)

(2)计 时

使用-t指定一个计时器,计时数满还未输入,read返回一个非0的退出状态。

使 用-n指定输入的字符个数,输入达到预定数目时,就自动结束输入

(3)默读

使用 -s使输入不显示在终端(例如输入密码)

(4)读取文件

最常用的方法是使用cat命令,并通过管 道传给包含read的while语句。

ex: cat test | while read line

为了让各位更多深入了解给一些例子

#!/bin/bash
#extracting command text_text_text_line options as parameters

help_info(){
    echo "NAME"
    echo "\t$0"
    echo "SYNOPSIS"
    echo "\t$0 is a shell test about process options"
    echo "DESCRIPTION"
    echo "\toption like -a -b param1 -c param2 -d"
}

if [ $# -lt 0 ]
then
    help_info
fi

nomal_opts_act()
{
    echo -e "\n### nomal_opts_act ###\n"

    while [ -n "$1" ]
    do
    case "$1" in 
        -a)
            echo "Found the -a option"
            ;;
        -b)
            echo "Found the -b option"
            echo "The parameter follow -b is $2" 
            shift
            ;;
        -c)
            echo "Found the -c option"
            echo "The parameter follow -c is $2"
            shift
            ;;
        -d)
            echo "Found the -d option"
            ;;
         *)
             echo "$1 is not an option"
            ;;
    esac
    shift
    done
}

#用shell命令自建的选项解析,可以按照自己的想法实现
#优点:自己定制,没有做不到,只有想不到
#缺点:麻烦

getopt_act()
{
    echo -e "\n### getopt_act ###\n"

    GETOPTOUT=`getopt ab:c:d "$@"`
    set -- $GETOPTOUT 
    while [ -n "$1" ] 
    do
    case $1 in 
        -a)
            echo "Found the -a option"
            ;;
        -b)
            echo "Found the -b option"
            echo "The parameter follow -b is "$2""
            shift
            ;;
        -c)
            echo "Found the -c option"
            echo "The parameter follow -c is "$2""
            shift
            ;;
        -d)
            echo "Found the -d option"
            ;;
        --)
            shift
            break
            ;;
         *)
             echo "Unknow option: "$1""
            ;;
    esac
    shift
    done

    param_index=1
    for param in "$@"
    do
        echo "Parameter $param_index:$param"
        param_index=$[ $param_index + 1 ] 
    done
}

#用getopt命令解析选项和参数
#优点:相对与getopts来说是个半自动解析,自动组织选项和参数,用 -- 符号将选项与参数隔开
#缺点:相对于getopts的缺点
#1.需要与set -- 命令配合,不是必须,需要手动shift
#2.选项参数中不支持空格如 -a -b dog -c "earth moon" -d -f param1 param2 就会解析错误

getopts_act()
{
    echo -e "\n### getopts_act ###\n"
    while getopts :ab:c:d ARGS
    do
    case $ARGS in 
        a)
            echo "Found the -a option"
            ;;
        b)
            echo "Found the -b option"
            echo "The parameter follow -b is $OPTARG"
            ;;
        c)
            echo "Found the -c option"
            echo "The parameter follow -c is $OPTARG"
            ;;
        d)
            echo "Found the -d option"
            ;;
         *)
             echo "Unknow option: $ARGS"
            ;;
    esac
    done

    shift $[ $OPTIND -1 ] 
    param_index=1
    for param in "$@"
    do
        echo "Parameter $param_index:$param"
        param_index=$[ $param_index + 1 ] 
    done
}

#getopts 命令解析选项和参数
#优点:可在参数中包含空格如:-c "earth moon"
#            选项字母和参数值之间可以没有空格如:-bdog
#            可将未定义的选项绑定到?输出
#            Unknow option: ?

nomal_opts_act -a -b dog -c earth -d -f param1 param2
getopts_act -a -b dog -c "earth moon" -d -f param1 param2
getopt_act -a -b dog -c earth -d -f param1 param2

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值