shell脚本

1、shell脚本概念

shell编程就是将在命令写在一个文件中,再用shell去执行这个程序,提高效率。shell脚本属于解释性语言,不需要编译直接运行。
(注:Shell脚本对空格十分敏感)

2、编写规范

设立了脚本文件以.sh作为后缀,第一行写上执行shell脚本的shell路径。
如:#!/bin/bash

1)执行
bash shell文件路径 -------- 启动新bash来执行
./shell文件路径------------ 将shell脚本加上可执行权限(777),即可直接 运行
.shell文件路径------------- 使用./source运行shell脚本(本shell)

2)输入/输出
echo------------- 输出
用法: echo 输出内容
-n表示本行最后不换行
“”(双引号)中的$变量名会被替换为变量的值
‘’(单引号)中不会左这的替换
`` (反引号)中的命令会被它执行的结果所替代

read------------- 输入
(将输入的内容输入到变量中,可以写多个变量一次赋值)
用法: read 变量
read -p …(提示信息) 变量名

变量
shell中的变量没有类型,默认使用字符串处理
查看shell中所有变量
declare ----- 变量和函数
set --------- 变量和函数
env --------- 环境变量

语法: 变量名=变量值------- 定义/修改变量
$变量--------------- 获取变量值

shell中的变量分为全局变量和本shell变量
本shell中的变量只能在本shell中使用
全局shell变量可以在子shell中(本shell直接/间接启动的shell)使用
变量默认是本shell变量,可以使用export将变量导出为全局变

变量与$组合使用:
${变量名:-值} --------------- 变量存在取变量的值,变量不存在取后面的值
${变量名:=值} --------------- 变量存在取变量的值,变量不存在定义变量为后面的值
${变量名:+值} -------------- 变量存在取变量的值,变量不存在取空值
${变量名:?值} -------------- 变量存在取变量的值,变量不存在输出错误信息
${#变量名} --------------- 变量的长度
变量名= -------------- 空值变量
以上语法中加:任务空值不是有效值,不加:认为空值是有效值

expr可以用来计算整数的加减法,我们经常用来判断输入的数据是不是整数,返回0或者1表示计算正常,大于1表示错误
expr还可以求出变量从第一位开始某些内容出现的次数
语法:
expr $变量:’[…]’

bc命令可以计算小数,用法:
“算数表达式”|bc
使用 scale=数字 来控制结果显示小数的位数
计算指数需要用^
echo “scale=5;1.1^2”|bc
使用sqrt开平方
echo “scale=5;sqrt(3)”|bc

bc还提供进制转换功能
obase 指定输出的进制,ibase 指定输入的进制
echo “obase=16;ibase=2;10101010”|bc

3)数组使用
直接使用即可,不需要定义,下标也不要求连续
通过 数 组 名 [ 下 标 ] 来 获 取 数 组 中 元 素 的 值 , 直 接 把 数 组 名 当 变 量 使 用 获 取 的 是 第 一 个 元 素 的 值 可 以 将 变 量 直 接 当 数 组 使 用 , 这 时 变 量 的 值 就 存 放 在 下 标 为 0 的 元 素 中 a [ ∗ ] 代 表 整 个 数 组 , {数组名[下标]} 来获取数组中元素的值,直接把数组名当变量使用获取的是第一个元素的值 可以将变量直接当数组使用,这时变量的值就存放在下标为0的元素中 a[*]代表整个数组, []使使0a[]{#数组名[*]}可以获取数组元素个数
read -a 数组名 -------------- 所有输入的数据都存入数组中

4)特殊变量
$# ----- 命令行参数个数,不包括自己
$* ----- 所有命令行参数的内容
$? ----- 获取上一个命令的返回状态(0—正常 非0—出错)
$$ ----- 当前进程进程号
$0 ----- 当前进程名
$n ----- 命令行第n个参数

5)条件表达式
shell中可以使用 [] 或者 test命令 来计算条件表达式
注:中括号和表达式中间必须有空格,表达式的条件和值之间也要有空格
大于: -gt
小于: -lt
等于: -eq
不等于: -ne
大于等于: -ge
小于等于: -le
与: -a
或: -o
非: !
注:表达式中可以有变量,但是必须用变量的值
[] 和 test命令 也可以用来对文件和字符串进行判断
-e:测试一个文件是否存在
-f:测试一个文件是不是普通文件
-d:测试一个文件是不是目录
-r:测试一个文件是否有读权限
-w:测试一个文件是否有写权限
-x:测试一个文件是否有执行权限
-s:测试一个文件是否非空
-z:测试字符串是否为空
-n:测试字符串是否非空
注:在中括号和test中中也可以使用==和!=,别的运算符不能用
在$之后的[]中可以计算整数算数表达式(表达式中可以有变量的参与),**表示计算指数
[[]] ---------- 双中括号用法和[]几乎一样,[[]]内部可以使用运算符&&和||,不能使用 -a -o,可以直接使用变量
(()) ---------- 双小括号内部直接使用运算符号,而且不用空格,内部直接使用变量,不能使用[]中语法

3.逻辑结构、函数

1)if结构

if 命令 / [] / [[]] / (())
then 命令
elif  命令 / [] / [[]] / (())
then 命令
else 命令
fi

2)case结构

case $变量 in
    值1)
        命令;;
    值2)
        命令;;
    值3)
        命令;;
    ...
    *)
        ....
esac

3)循环结构
(1)for循环-------遍历一组数据

for 变量 in 一组数据
do
......
Done

(2)while循环-----条件成立继续循环,不成立结束循环

while 条件/命令
do
...
Done

(3)until循环------条件不成立继续循环,成立结束循环

until 条件/命令
do
...
done

4)select语法

select 变量 in 一组数据
do
....
done

5)shell中的函数

函数名()
{
...
}

调用函数直接写函数名即可
函数可以有返回值,使用return来指定返回值,在函数调用语句后使用$?获取返回值
调用函数时也可以给函数传数据,直接把要传入的数据写到调用语句之后
:是一个什么都不做的命令,可以把一个表达式变成一条完整的命令

在函数中定义变量默认也是本shell变量,可以在本shell中使用
可以在函数中定义本地变量,这种变量只能在本函数中使用
语法:
local 变量名
全局变量 --------- 本shell和子shell可以访问
本shell变量 ------ 本shell可以访问
本地变量 --------- 本函数可以访问

6)几个命令的补充
sort命令 --------- 对给定的内容(文件)进行排序
uniq命令 --------- 去掉文件中重复的行
seq命令 ---------- 产生给定的序列
seq 起始数字 间隔大小 结束数字

7)正则表达式
正则表达式用于进行字符串匹配
* ---------- 通配符,代表任意多个任意字符
? ---------- 通配符,代表1个任意字符
^xxx -------- 匹配行首
xxx$ -------- 匹配行尾
[] --------- 匹配范围
{} --------- 匹配的次数 {最少,最多},大括号要转义

8)patsubst函数
格式:$(patsubst pattern,replacement,text)
例子:
$(patsubst %.c,%.o,a.c b.c)
将字符串(a.c b.c)符合模式[%.c]的单词替换成[%.o],返回结果为”a.o b.o”

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值