Shell脚本编程基础
shell概念:
shell是一个用C语言编写的程序,他是用户使用Linux的桥梁,它是一种命令语言,同事也是一种编程语言.用户可以通过Shell访问操作系统和内核服务.Linux的Shell种类众多,Bash是大多数Linux系统默认的Shell,所以我以Bash为例学习shell脚本编程.
shell变量:
变量的命名
- 命名只能使用,字母/数字/下划线
- 中间不能有空格
- 不能使用标点符号
- 不能与关键字重合
变量操作
- 使用: $变量名 或者 ${变量名}
#!/bin/bash # 表示为bash的shell 也可以写成#!/bin/sh
a=4
b=5
c=`expr $a + $b`
echo $c
- 设置只读变量: 变量名 readonly
- 删除变量: unset 变量名
- 变量的赋值用'=',需要注意的是等号两边不要有空格,比如a=1是对的,但是a = 1或a= 1都是错的,'command not found'
变量的分类
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
特殊变量
有些变量是一开始执行脚本时就会设定,且不能被修改,但我们不叫它只读的系统变量,而叫它特殊变量
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个后台程序的PID
$? 执行上一个指令的返回值
shell中常用数据类型
- 字符串:
- 可以使用单引号也可以使用双引号,单引号表示原样字符串,单引号中变量或者转义符都会无效,单引号里也不能出现单引号;
- 提取字符串长度 ${#变量名}
- 字符串切片 ${变量名:开始位置:结束位置}
str1='abc'
str2="$str1"
str3='$str1'
echo $str1 $str2 $str3 #输出abc abc $str1
echo ${#str1} #输出3
echo ${str1:1:2} #输出bc 开始位置1 结束位置2 编程语言中一般都是以0是开始的
- 数组:
- 数组的定义: 变量名=(值1 值2... 值n)
- 数组的读取: ${变量名[下标]} 或 取所有元素用${变量名[@]}
- 数组的长度: ${#变量名}
array1=(1 3 5 7 9) #注意数组中每个值用空格隔开而不是逗号
echo $array1 #输出1 默认下标0
echo ${array[4]} #输出9
echo ${array1[@]} #输出1 3 5 7 9
echo ${#array1[@]} #输出5
echo ${#array1} # 输出1 取的是单个元素 默认的下标是0 单个元素长度为1
- 注释:
- 以#开头的就是注释,会被解释器直接忽略
shell传参
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$$ | 脚本运行的当前进程PID号 |
$! | 后台运行的最后一个进程的PID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
shell运算符
- 由于原生bash不支持简单的数学运算,但是可以通过其他命令实现,例如awk/expr,其中expr最常用,expr是一款表达式计算工具,使用时要用撇号`包起来(撇号就是键盘上1左边的那个),而且需要注意的是它有严格的语法规范,表达式与运算符之间一定要有空格!例如`expr $a + $b`是对的,但是`expr $a+$b`是错误的!
- 算数运算符:
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | `expr $a + $b` |
- | 减法 | `expr $a - $b` |
* | 乘法 | `expr $a * $b` |
/ | 整除法 | `expr $a / $b` 如`expr 8 / 3`结果为2 |
% | 取余 | `expr $a % $b` |
= | 赋值 | a=$b |
== | 相等 | $a == $b 判断是否相等 相等返回true 不相等返回false |
!= | 不相等 | $a != $b 相等返回false 不相等返回true |
- 关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字.
运算符 | 说明 |
---|---|
-eq | 检测两个数是否相等,相等返回true |
-ne | 检测两个数是否不等于,不等返回true |
-gt | 检测左边的数是否大于右边的,是就返回true |
-lt | 检测左边的数是否小于右边的,是就返回true |
-ge | 检测左边的数是否大于等于右边的,是就返回true |
-le | 检测左边的数是否小于等于右边的,是就返回true |
- 布尔运算:
! : 非运算符,[!true] 返回false
-o: 或运算符,任一true 返回true
-a: 与运算符,任一为false 返回false
- 逻辑运算符:
&& 逻辑的AND
|| 逻辑的OR
- 字符串运算符
= 检测两个字符串是否相等,相等返回 true
!= 检测两个字符串是否相等,不相等返回 true
-z 检测字符串长度是否为0,为0返回 true
-n 检测字符串长度是否为0,不为0返回 true
str 检测字符串是否为空,不为空返回 true 举例 a='abc' [$a]返回ture
shell命令
- shell echo命令: 用于字符串的输出
-
echo abc 和 echo "abc" 是一样的
-
可以显示普通字符串\转义字符\变量
echo "Hello world" #返回Hello world
text="Hello world"
echo $text #返回Hello world
echo "Hello world"#返回"Hello world"
-
可以定向至文件
echo "Hello world" > test.log 会将"Hello world"定向输出到test.log中 -
可以显示命令执行结果
echo `data` #注意是撇号,结果将显示目前的日期
echo `expr 2 + 3` #执行结果5
- shell printf命令:
- 可以格式化字符串输出 格式替代符(%s %c %d %f)
- 可以转义序列
\a | 警告字符 |
---|---|
\b | 后退 |
\c | 抑制,结尾不换行且后面的格式字符串中的字符都会被忽略 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ | 一个 \ |
- shell test命令:
test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。格式为 test 条件语句
- 测试字符串
test str1==str2 测试两个字符串是否相同
test str1 !=str2 测试两个字符串是否不同
test str1 测试是否为字符创
test -n str1或test -z str1 测试是否为空的字符串
- 测试整数
test int1 -eq int2 测试是否相等
test int1 -ne int2 测试是否不等
test int1 -le int2 测试是否小于等于
test int1 -lt int2 测试是否小于
test int1 -ge int2 测试是否大于等于
test int1 -gt int2 测试是否大于
- 测试文件
test -d file 测试是否为目录
test -f file 测试是否为文件
test -x file 测试是否是可执行文件
test -r file 测试是否是可读文件
test -w file 测试是否是可写文件
test -e file 测试文件是否存在
test -s file 测试文件是否为空
可简写 如 test -x file 可简写为 [ -x file ] 注意中括号旁一定加空格把执行命令括起来
shell 循环与分支
- 分支: if 和 if else 和 if elif else
if 条件语句
then
条件为真执行语句
fi
也可以这样写为一行:if 条件语句; then 条件为真执行语句;fi
下面同理要么换行要么用';'
if 条件语句
then
条件为真执行语句
else
条件为假执行语句
fi
if 条件1语句
then
条件1为真执行语句
elif 条件2语句
then
条件2为真执行语句
else
条件1与条件2都为假执行语句
fi
- 循环语句: for循环 while循环 until循环 case循环
跳出循环break 跳出本次循环 continue
举例说明:返回0到100的整数和
#! /bin/bash
sum=0
for ((i=0; i<=100; i++))
do
sum=`expr $sum + $i`
done
echo $sum #返回5050
#! /bin/bash
i=0
while(($i<=3))
do
echo $i
let "i++"
done
运行脚本,输出:
0
1
2
3
网友评论