shell脚本会了吗,不会的看这里,教你一一来学,还有实例哦
1.shell脚本
定义:多条命令按顺序执行,就是shell脚本
例如:vim hello.sh
两种执行的方式:
1.直接执行:bash hello.sh
2.给当前用户或所有用户加上可执行权限,再执行:./hello.sh
chmod u+x hello.sh //对当前用户增加执行权限
1.2 shell变量
1.2.1. 赋值:变量名=值
(1) 变量不用定义,直接赋值即可, 赋值时,赋值号前后不能有空格
(2) 赋值给变量的数据当字符串处理
注意:shell里边变量名提议用大写的
例子:DATE=`date`
1.2.2. 取值
$变量名或${变量名}
注意:取变量值的时候,需要给美金符号($)
1.2.3. 删除变量值:unset 变量名
例子:unset DATE
实例:给IFPO赋值一个命令, 然后echo输出命令
1.3命令行参数变量
命令行:脚本启动时,shell程序会自动赋值,在脚本中可以直接取值:
$0 脚本名
$1 - $9 脚本参数
$* 所有的命令行参数
$# 命令行参数个数
$? 前一个命令的结果
$$ 当前shell脚本进程ID
0 正常退出 //这里可以判断一下ls -l +文件名存在的时候,执行完之后的结果
1 异常退出 //这里可以判断一下ls -l +文件名不存在的时候,执行完之后的结果
同样可以有参数:
实例:
1.4系统环境变量
系统shell赋值的变量,shell脚本中可以直接使用:
$PATH 执行命令时,未指定命令的绝对路径,从此变量指定的路径中搜索
$HOME 指定用户主目录:/home/ubuntu
追加环境变量路径:
导出环境变量:在子处调用父中变量
补充:注释:以#打头的行
1.5 read
用处:读取一行用户输入
read VAR(定义变量)
echo $VAR(输出变量值)
实例:
补充:指定脚本解析器:#!/bin/bash
echo $SHELL:查看当前自己环境用的bash
1.6算术计算命令(expr.sh)
expr 数学表达式
数学表达式中支持的运算符:+, -, \* , /, %
注意:乘法(因为*有特殊含义,需要转义)
实例:
注意:运算符前后都有空格,不加空格,会把我们的值理解成字符串
等号前后不需要空格
补充:其他算法
(1)let
例如:var=1
let "var+=1"
echo $var
注意:a)经测试let几乎支持所有的运算符,在网上看到一篇文章说“let不支持++、--和逗号、(、)”,但经测试自加、自减、以及括号的优先级都得到了很好的支持
b)方幂运算应使用“**”
c)参数在表达式中直接访问,不必加$
d)一般情况下算数表达式可以不加双引号,但是若表达式中有bash中的关键字则需加上
e)let后的表达式只能进行整数运算
(2)使用(())
var=1
((var+=1))
echo $var
输出结果为2
注意:(())的使用方法与let完全相同
(3)使用$[]
var=1
var=$[$var+1]
echo $var
输出结果位2
注意:a)$[]将中括号内的表达式作为数学运算先计算结果再输出
b)对$[]中的变量进行访问时前面需要加$
c)$[]支持的运算符与let相同,但也只支持整数运算
(4)使用expr
var=1
var=`expr $var + 1`
echo $var
输出结果为2
注意:a)expr后的表达式个符号间需用空格隔开
b)expr支持的操作符有: |、&、<、<=、=、!=、>=、>、+、-、*、/、%
c)expr支持的操作符中所在使用时需用\进行转义的有:|、&、<、<=、>=、>*
e)expr同样只支持整数运算
1.7测试命令
test 表达式
等价于:[ 表达式 ]
注意: [ 后面一定要有空格, ] 前面一定要有空格
test命令没有输出, 只有程序退出状态
表达式(注意: 运算符合操作数之间有空格):
1. 字符串比较
str1 = str2 相等(注意空格)
str1 != str2 不等
-z str 为空
-n str 不空
2. 整数比较
a -eq b 相等
-ne 不相等
-ge 大于等于
-le 小于等于
-gt 大于
-lt 小于
3. 文件测试
-d file 目录? (file即为要测试的文件)
-e file 存在文件或目录?
-f file 普通文件?
-r file 存在可读?
-w file 存在可写?
-x file 存在可执行?
-s file 存在长度不为0
f1 -nt f2 f1 比 f2新?
f1 -ot f2 f1 比 f2旧?
4. 逻辑运算
a -a b 且
a -o b 或
注意;0表示真 1表示假
测试语句:echo $? //输出上一次的返回结果
实例
1.8 if语句
1.8.1. if
语法
if [命令1] 相当于if()
then {
命令列表 语句
fi }
执行流程:(1) 执行 命令1
(2) 如果为真($? 为 0), 执行 命令列表
5.8.2 if ... else
语法
if 命令1
then
命令列表1
else
命令列表2
fi
执行流程:(1) 执行 命令1
(2) 如果为真($? 为 0), 执行命令列表1
如果为假, 执行命令列表2
1.8.3 if ...elif...elif...
语法
if 命令1
then
命令列表1
elif 命令2
then
命令列表2
else
命令列表*
fi
执行流程:(1) 执行 命令1
(2) 如果为真, 执行 命令列表1
(3) 如果为假, 执行 命令2
(4) 如果为真, 执行 命令列表2
如果为假, 命令列表*
实例:
1.9 case语句
1.9.1语法
case 值(结果为字符串的表达式或变量) in
模式1)(类似于通配符)
命令
;;(类似于break)
模式2)
命令
...
;;
*)//默认模式
命令
...
;;
Esac
注意:模式可以包含 *, ?, [...]等文件名匹配模式(模式就是正则表达式)
例如:y | yes | Y | Yes)
实例:
1.10 while
1.10.1 语法
while [ 关系表达式 ]
do
命令列表
done
1.10.2 流程
(1) 执行 [ 关系表达式 ]
(2) 结果为真, 执行 命令列表后,再执行(1)
假 结束 while语句
实例:
1.11 continue
1.11.1语法
continue n
n 为整数
1.11.2 执行流程
结束n层的本次循环
实例:计算奇数和
1.12 for
1.12.1. 语法
for 变量 in 字符串列表
do
命令列表
done
注意:in 后面到列表省略,表示使用脚本参数做为字符串列表
1.12.2 执行流程
变量按顺序取字符串列表中到值,每个值执行一次命令列表
实例:
1.13 break
1.13.1 语法
break n(n 为整数)
1.13.2 执行流程
结束n层循环
实例:
1.14 函数
1.14.1 定义
function 函数名()
{
local 变量赋值
命令列表
...
return 值
}
注意:function 关键字可以没有,但是函数名()必须有
函数可以用$0 - $9的变量,从函数外获取值
return 命令可以返回值给$?变量
local申明的变量作用范围为函数内部
2. 调用
OUT=`function_name 参数1 参数2`
function_name 参数1 参数2
定义在前,调用在后,且必须在同一个脚本中
OUT变量可以获取到函数的输出
实例:
注意:在文件系统中,禁止将自己的目录下的所有文件拷贝到自己目录下的某个文件