一、Shell中的变量
任何编程语言中,有关变量的定义,作用范围,赋值等都是最最基础的知识。
1、默认变量
$0 当前脚本名称
$1 脚本接收的第一个参数
$2 脚本接收的第二个参数
$# 脚本接收的所有参数个数
$@ 脚本接收的所有参数
$* 脚本接收的所有参数
$? 前一行命令的执行状态
2、变量定义及赋值
赋值处必须为一个整体,不能有空格。想要包含空格,需要用单引号或双引号包围。单引号(')和双引号(")的区别:单引号中保持原样输出。而双引号中会替换成其变量值。
3、`符号
在该符号中的命令会被执行。可以用$()替换
4、命令行交互read
read命令的使用形式为
read [-pt] variable
参数p:后面可以接提示符
参数t:后面可以接秒数
5、定义变量类型declare
默认情况下,变量的赋值内容都是字符类型的。
declare命令的使用形式如下:
declare [-aixr] variable
参数a:将variable定义为数组
参数i:将variable定义为整型(integer)
参数x:将variable设置成环境变量,类似于export的作用
参数r:variable为readonly类型,值不能被更改
二、Shell中的集合类型
1、数组(array)
(1)数组定义和赋值
数组中的元素用括号包围,各元素之间用空格隔开,可以重新设置指定元素的内容 。
(2)数组元素访问
数组元素下标从0开始,想要访问指定位置的元素,使用[]指定下标值
(3)获取数组长度
获取数组长度使用如下命令
echo ${#array_name[@]}
获取数组中单个元素的长度使用如下命令
echo ${#array_name[2]}
2、map
定义map变量 declare -A m=(["a"]="1" ["b"]="2")
输出所有的key echo ${!m[@]}
输出所有的value echo ${m[@]}
输出指定key对应的value echo ${m["a"]}
map中键值对的个数 echo ${#m[@]}
三、Shell中的字符操作
1、字符串删除
删除前面的http:// echo ${str#http://}
删除后面的a echo ${str%/a}
#从前往后截取,%从后往前截取。如果使用两个#,或者两个%,则表示将符合的最长数据删除。
2、字符串截取
可以从字符串的指定位置开始截取,同时可以指定截取的位数,如下所示:
echo ${str:2} // 从第二位开始截取到最末尾,第一个字符下标为0
echo ${str:2:3} // 从第二位开始顺序截取三个字符
3、字符串替换
将http替换成HTTP echo ${str/http/HTTP}
使用一个斜杠(/)表示只替换第一个遇到的字符。使用两个斜杠(//)则表示替换全部符合的字符。使用#匹配以指定字符开头的字符串。使用%匹配以指定字符开头的字符串。
4、字符串默认值
如果变量没有赋过值,则给一个默认值,否则使用指定的值。如果变量内容为“”或者变量未初始化则给默认值,可以在-前加个冒号使用。
5、字符串长度
求字符串长度用#操作 echo ${#str}
6、字符串包含
有时候需要判断字符串str1中是否包含字符串str2,使用=~操作符。
if [[ $str1 =~ $str2 ]];then
四、Shell中的控制结构
1、条件表达式
(1)if … then
if [ 判断条件1 ]; then
执行内容1
elif [ 判断条件2 ]; then
执行内容2
else
执行内容3
fi
a)算术运算符
b)关系运算符
常用的关系运算符包括
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
c)布尔运算符
常用的布尔运算符如下
! 非运算,表达式为 true 则返回 false,否则返回 true。
-o 或运算,有一个表达式为 true 则返回 true。
-a 与运算,两个表达式都为 true 才返回 true。
d)字符串运算符
常用的字符串运算符如下
= 检测两个字符串是否相等,相等返回 true。
!= 检测两个字符串是否相等,不相等返回 true。
-z 检测字符串长度是否为0,为0返回 true。
-n 检测字符串长度是否为0,不为0返回 true。
str 检测字符串是否为空,不为空返回 true。
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是具名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
2、循环表达式
(1)while do done, untile do done
while循环的格式如下
while [ condition ]
do
程序
done
与while循环相反的是until循环。
while [ condition ]
do
程序
done
在while循环中,当条件满足使,就执行其中的程序。而until循环中,当条件不成立时就终止循环。
(2)for … do … done
for循环的格式如下
for var in con1 con2 con3 ...
do
程序
done
(3)for … do … done的另一种形式
for循环的另一种个数如下
for ((初始值; 目标值; 步长))
do
程序
done
五、Shell中的函数
1、函数定义
Shell是从上往下执行的,所以在定义函数之前就调用该函数的话,会提示command not found
2、函数参数与shell参数
在Shell中定义的函数,是可以传递和接收参数的。在子函数中,$1表示接收的第一个参数…。但是测试后发现$0表示的仍然是shell名称。如果想要显示当前函数名,可以使用$FUNCNAME参数
function printStr() {
echo "printStr function print: $FUNCNAME"
echo "printStr function print: $*"
}
echo "main print: $0"
echo "main print: $*"