Skip to main content

moregeek program

shell 必知的脚本知识(上篇)-多极客编程


shell 必知的脚本知识(上篇)_基础运维

 写在前面,本篇适用于有一定shell基础的同学,主要对shell处理用户输入相关的常用小知识点的归总,主要涵盖以下几个知识点:


  • 脚本外部参数
  • 脚本参数跟踪
  • 移动变量
  • 处理选项
  • 将选项标准化
  • 获得用户输入

一、shell命令行传入参数

1.1 数值参数传入

shell 脚本语言的传入参数,相较于其他语言会更直接易懂,bash shell会将一些称为位置参数(positional parameter)的特殊变量分配给输入到命令行中的 所有参数。这也包括shell所执行的脚本名称。位置参数变量是标准的数字:$0是程序名,$1是第 一个参数,$2是第二个参数,依次类推,直到第九个参数$9。

实例演示:

shell 必知的脚本知识(上篇)_bash_02

 说明:

命令行参数可以同时输入多个,每个参数都必须用空格分开。

1.2 文本字符串参数传入


实例演示:


shell 必知的脚本知识(上篇)_基础运维_03

1.3 空格文本字符串传入

 实例演示:

shell 必知的脚本知识(上篇)_linux_04

 1.4 任意参数传入

上面我们提到变量可以一致到$9,如果超过9个,变量 10以上也是可以使用的,此时需要用{} 包含。比如 ${10} ,这样就满足了从命令行向脚本传入任意多的参数.

 实例演示:

shell 必知的脚本知识(上篇)_linux_05

二、shell脚本名称的获取


$0
参数获取
shell
在命令行启动的脚本名。

示例演示:

shell 必知的脚本知识(上篇)_大数据_06

 这样会有一个问题,当我们使用绝对路径来指定脚本的时候,获取的文件名就对带有绝对路径,此时就需要借助另一个命令 basename,它会剥离脚本的绝对路径和脚本名称。

示例演示:

shell 必知的脚本知识(上篇)_大数据_07

 三、shell判断参数是否存在


当脚本认为参数变量中会有数据而实际上并没有时,脚本很有可能会产生错误消息。这种写脚本的方法很容报错。在使用参数前一定要检查其中是否存在数据。


示例演示:


shell 必知的脚本知识(上篇)_大数据_08

四、shell统计参数个数


特殊变量
$#
含有脚本运行时携带的命令行参数的个数。可以在脚本中任何地方使用这个特殊


变量,就跟普通变量一样。


实例演示:


shell 必知的脚本知识(上篇)_基础运维_09

 五、shell获取命令行最后一个参数

shell 必知的脚本知识(上篇)_linux_10

六、shell获取所有参数


 
$*和
$@变量可以用来轻松访问所有的参数。这两个变量都能够在单个变量中存储所有的命


令行参数。


$*变量会将命令行上提供的所有参数当作一个单词保存。这个单词包含了命令行中出现的每


一个参数值。基本上$*变量会将这些参数视为一个整体,而不是多个个体。


 
另一方面,$@变量会将命令行上提供的所有参数当作同一字符串中的多个独立的单词。这样  你就能够遍历所有的参数值,得到每个参数。这通常通过for命令完成。   

示例演示:

相同效果:

shell 必知的脚本知识(上篇)_大数据_11

 不用效果:

shell 必知的脚本知识(上篇)_linux_12

七、shell移动变量


        bash shell工具箱中另一件工具是
shift
命令。
bash shell

shift
命令能够用来操作命令行参 数。跟字面上的意思一样,shift
命令会根据它们的相对位置来移动命令行参数。


        在使用shift
命令时,默认情况下它会将每个参数变量向左移动一个位置。所以,变量
$3


的值会移到
$2
中,变量
$2
的值会移到
$1
中,而变量
$1
的值则会被删除(注意,变量
$0
的值,也就是程序名,不会改变)。


        这是遍历命令行参数的另一个好方法,尤其是在不知道到底有多少参数时。可以只操作 第一个参数,移动参数,然后继续操作第一个参数。

 演示示例:

shell 必知的脚本知识(上篇)_基础运维_13

八、shell选项参数的处理


8.1 使用
shift
命令来依次处理脚本程序携带的命令 行参数。也可以用同样的方法来处理命令行选项。

示例演示:

shell 必知的脚本知识(上篇)_大数据_14

 8.2 分离参数和选项


这个特殊字符是双破折线(
--
)。
shell
会用双破折线来表明选项列表结束。在双破折线之后,脚本就可以放心地将剩下的命令行参数当作参数,而不是选项来处理了。

shell 必知的脚本知识(上篇)_bash_15

 shell 必知的脚本知识(上篇)_基础运维_16

脚本说明:


在遇到双破折线时,脚本用
break
命令来跳出
while
循环。由于过早地跳出了循环,我们需


要再加一条
shift
命令来将双破折线移出参数变量。

8.3 处理带值的选项


有些选项会带上一个额外的参数值。在这种情况下,命令行看起来像下面这样。


shell 必知的脚本知识(上篇)_linux_17

脚本代码: 

#!/bin/bash 
# extracting command line options and values
echo
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option";;
-b) param="$2"
echo "Found the -b option, with parameter value $param"
shift ;;
-c) echo "Found the -c option";;
--) shift
break ;;
*) echo "$1 is not an option";;
esac
shift
done
#
count=1
for param in "$@"
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done

演示示例 :

shell 必知的脚本知识(上篇)_linux_18

 代码说明:


在这个例子中,
case
语句定义了三个它要处理的选项。
-b
选项还需要一个额外的参数值。


由于要处理的参数是
$1
,额外的参数值就应该位于
$2
(因为所有的参数在处理完之后都会被移 出)。只要将参数值从$2
变量中提取出来就可以了。当然,因为这个选项占用了两个参数位,所以你还需要使用shift
命令多移动一个位置

 

©著作权归作者所有:来自51CTO博客作者涤生手记的原创作品,如需转载,请注明出处,否则将追究法律责任
shell 必知的脚本知识(上篇)
https://blog.51cto.com/u_15346267/4538046