shell编程

变量的作用域

环境变量=全局变量

自定义变量=局部变量

   1、全局变量:针对所有模块生效

   2、文件中定义的变量,本模块文件中有效。

   3、 函数内local命令定义的变量,仅函数内有效。

备注:文件中若想使用其他文件中的变量,需进行导入,命令:

.文件名 或 source 文件名

位置变量

命令行参数允许在运行脚本时向命令行传递参数

$0-$9,当超过$9后,必须在变量数字周围加花括号,对应关系如下

#./addem     a     b        c     d    e      f     g     h      i      g        k .....

  $0             $1    $2     $3  $4   $5   $6   $7   $8   $9   ${10}  ${11}...

$# 位置变量参数个数,从$1开始计算

$@ 参数列表,将所有位置参数当做同一字符串的多个独立单词,允许遍历。

$* 参数列表,将所有位置参数当做一个单词保存

${!#} 最后一个参数值

$$  当前进程的进程号

tips:$@和$*在遍历时一定要使用引号引起来(因为变量内容中内含空格),如果不加引号,遍历时,无区别。

# ./hi.sh 1 "2 3" 4 

遍历时不加引号,for循环遍历结果:

1

2

3

4

遍历时加引号,for循环遍历结果:

“$*”方式结果:

1 2 3 4

"$@"方式结果:

2 3

4

数组

数组是可以存储多个值的变量,shell支持一维数组

数字数组:索引值为数字,相当于python的列表

关联数组:索引值任意,相当于python的字典

数字数组

创建数字数组

方法1:数组名=(元素1 元素2 元素3...)   #索引默认从0开始

方法2:数组名=([索引1]=元素值1 [索引2]=元素值2...)

推荐使用方法1

访问数组元素 {}方式

访问所有数组元素

   ${数组名[*]}    #所有元素作为1个元素保存,不允许遍历

   ${数组名[@]}  #所有元素作为独立的元素保存,允许遍历

访问单个数组元素

   ${数组名[索引值]}

切片方式访问数组元素

#mytest=(one two three)

1.整个数组切片

${数组名[@]:start[:offset]}

#echo ${mytest[@]:1:2}  #索引1开始取

two three

2.单个元素内部切片

${数组名[索引值]:start[:offset]}

echo ${mytest[0]:0:2}  

on

tips:

     访问数组元素时,必须加{},否则得到的是第一个元素值(echo $数组名)

     普通变量可看作只有一个元素的数组

  hi='hello world'

  echo ${hi[0]}

  hello world

修改/增加元素

数组名[索引值]=value

数组元素个数

${#数组名[@]}

单个数组元素的长度

${#数组名[索引值]}

访问数组最后1个元素

${数组名[$(expr ${#数组名[@]} - 1)]}   #红色部分得到最后一个元素的索引值

数组尾部增加一个元素new

方法1:数组名=("${数组名[@]}" "new")

方法2:数组名[${#数组名[@]}]="new"

数组也支持变量内容替换、删除等操作

eg:

#mytest=(one1 two2 one1 three3)  

#echo ${mytest[@]##o*e}   #删除元素开头位置符合o*e的元素内容(最长匹配)

1 two2 1 three3

关联数组

capital["Illinois"]="Springfield"

capital["Indiana"]="Indianapolis"

退出状态码

$? 上一命令执行的退出状态码,上一命令执行成功,返回0,不成功返回1-255,可使用echo $?取到

        状态码    描述

         0        命令成功结束

         1         通用未知错误

         2         误用shell命令

         126       命令不可执行

         127       没找到命令

         128       无效退出参数

         128+x     linux信号x的严重错误

         130       命令通过ctrl+C终止

         255       退出状态码越界

111
原文地址:https://www.cnblogs.com/zmdsg/p/7086978.html