1.shell脚本的抒写方式
1.1shell脚本名:
名字要有意义,不要使用a、b、c、1、2、3、这种方式命名;虽然Linux系统中,文件没有扩展名的概念,依然建议使用.sh结尾;名字不要太长,最好能在30个字节以内解决。例如:check_memorooy.sh
1.2shell脚本格式:
Shell脚本开头必须指定脚本运行环境,以#!这个特殊符号组合来组成。如:#!/bin/bash指定该脚本是运行解析有/bin/bash来完成的;
1.3shell脚本中的#使用:
!/bin/bash
Author:sunfuyang
Created Time: 2021-11-30
Script Destcription: first shell script
2.shell脚本执行方式
1 脚本运行需要执行权限,当我们给一个文件赋予执行权限后,该加班就可以运行。
chmod u+x filename
./filename
2.如果不希望赋予脚本执行权限,那么可以使用bash命令来运行
bash filename
- 使用父shell执行 将文件中的内容拿到父shell中执行 登陆的xshell第一次窗口称为父shell
source filename
3.shell变量定义
1.变量定义方式
1用户自定义变量:人为定义变量名与变量的值。
2系统环境变量:保存的是和操作系统操作环境相关的数据,所有用户都可以使用。
3位置参数变量:向脚本中进行传参,变量名不能自定义,变量作用是固定的。
4预定义的变量:是bash中已经定义好的变量,变量名不呢自定义,变量的作用也是固定的。
1.1用户自定义变量,变量名=变量值。不能出现‘-横杠’命名
[root@test ~]# a="hellow word"
[root@test ~]# echo $a
hellow word
1.2shell核心位置环境变量
1) $0表示脚本的名称 全路径执行 显示全路径的脚本名称
2) $n表示脚本的第n个参数 n为数字 0已经被脚本名称占用 从1开始 从$9后 需要加花括号引起来作为一个整体${10}
3) $#表示传参的个数 控制传参的个数
4) $*表示传参的所有参数 不加双引号和$@相同 加上双引号 表示为一个参数 在脚本中相同 循环体不同
5) $@ 表示传参的所有参数 不加双引号和$*相同 加上双引号 表示为正常的传参
6) $? 表示上一条命令执行的结果 0为成功 非0失败 返回值0-255 可以自定义返回值
7) $$ 表示脚本的PID
8) $! 表示上一个在后台运行的脚本的PID
9) $_ 表示获取脚本的最后一个参数 类似esc .
2.按照生命周期划分环境变量
1.永久的
需要写入/etc/profile 使用远程连接工具连接自动加载/etc/profile 或者使用source 或. 重新在父shell中执行
2.临时的
使用export 声明即可
不加export 只对当前的shell生效
加export对当前打开窗口的所有shell生效
查看环境变量
echo $变量名称
unset $变量名称 取消环境变量
4.shell变量赋值read
除了自定义变量,以及系统内置变量,还可以使用read命令通过交互方式传递变量
read选项 选项含义
-p 打印信息
-t 限定时间
-s 不回显
-n 指定字符个数
5.变量删除与替换
1.什么是变量替换?
简单来说,就是在不改变原有变量的情况下,对变量进行替换。
2.为什么要使用变量替换?
比如:我们需要对某个变量的值进行整数比较,但变量的值是一个小数。怎么办?我们可以使用变量替换的方式,将小数位进行删除,然后再进行整数比对。
3.变量替换的几种方式。
变量 说明
${变量#匹配规则} 从头开始匹配,最短删除
${变量##匹配规则} 从头开始匹配,最长删除
${变量%匹配规则} 从尾开始匹配,最短删除
${变量%%匹配规则} 从尾开始匹配,最长删除
${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换第一个
${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全部替换
[root@test /server/script]# url=www.baidu.com
[root@test /server/script]# echo $url
www.baidu.com
从头匹配到(.点)然后删除最近的点
[root@test /server/script]# echo ${url#*.}
baidu.com
从头匹配到(.点)然后删除最远的点
[root@test /server/script]# echo ${url##*.}
Com
从尾匹配到(.点)然后删除最近的点
[root@test /server/script]# echo ${url%.*}
www.baidu
从尾匹配到(.点)然后删除最远的点
[root@test /server/script]# echo ${url%%.*}
www
将.替换为,只替换第一个
[root@test /server/script]# echo ${url/./,}
www,baidu.com
将.替换为,全部替换
[root@test /server/script]# echo ${url//./,}
www,baidu,com
6.变量的子串(切片及长度统计)
变量切片
[root@fsf /server/script]# url=www.buyao007.icu
[root@fsf /server/script]# echo $url
www.buyao007.icu
[root@fsf /server/script]# echo ${url:2:2}
w.
[root@fsf /server/script]# echo ${url:2:3}
w.b
统计变量子串的长度
[root@fsf /server/script]# echo $url
www.buyao007.icu
[root@fsf /server/script]# echo $url|wc -L
16
[root@fsf /server/script]# echo $[ echo $url|wc -c
-1 ]
16
[root@fsf /server/script]# echo ${#url}
16
awk统计出变量中的长度小于3的值
[root@fsf /server/script]# name="I am sunfuyang I am 18"
[root@fsf /server/script]# echo $name
I am sunfuyang I am 18
[root@fsf /server/script]# echo $name|awk '{for(i=1;i<=NF;i++)if(length($i)<3)print $i}'
I
am
I
am
18
[root@fsf /server/script]# echo $name|xargs -n1|awk '{if(length<3)print}'
I
am
I
am
18
7.变量的整数运算
1.什么是变量运算?
其实就是加减乘除
2.为什么要学习变量运算?
比如:当我们需要开发一个计算器的时候是不是就需要运算了?
3.变量运算使用什么方式来实现?
通常整数运算有expr、$(())、$[]、let等方式,小数运算有bc、awk方式。
操作符 含义
num1 + num2 加
num1 - num2 减
num1 * num2 称
num1 / num2 除
num1 % num2 余
4.变量运算基本使用与示例?
定义变量,使用expr、$(())、$[]、进行加减乘除。expr必须空格隔开。
[root@test /server/script]# num1=10
[root@test /server/script]# num2=20
[root@test /server/script]# expr $num1 + $num2
30
[root@test /server/script]# echo $((num1+num2))
30
[root@test /server/script]# echo $((num1 + num2))
30
[root@test /server/script]# echo $[num1 + num2]
30
[root@test /server/script]# echo $[4 % 3]
let的i++与++i的区别
直接做运算是相同的
[root@fsf /server/script]# let i++
[root@fsf /server/script]# echo $i
1
[root@fsf /server/script]# let ++a
[root@fsf /server/script]# echo $a
1
在变量中是不一样的
[root@fsf /server/script]# unset i
[root@fsf /server/script]# unset a
[root@fsf /server/script]# let i=a++
[root@fsf /server/script]# echo $i
0
[root@fsf /server/script]# echo $a
1
[root@fsf /server/script]# let b=++c
[root@fsf /server/script]# echo $b
1
[root@fsf /server/script]# echo $c
1
let运算 需要使用变量 只支持整数运算
[root@fsf /server/script]# let sum=1+1
[root@fsf /server/script]# echo $sum
2
[root@fsf /server/script]# num1=10
[root@fsf /server/script]# num2=20
[root@fsf /server/script]# let count=$num1+$num2
[root@fsf /server/script]# echo $count
30
bc 支持小数和整数运算
[root@m01-shell ~]# echo 10+10|bc
20
[root@m01-shell ~]# echo 10*10|bc
100
[root@m01-shell ~]# echo 10-10|bc
0
[root@m01-shell ~]# echo 10-10.5|bc
-.5
awk运算
[root@m01-shell ~]# awk 'BEGIN{print 10+10}'
20
[root@m01-shell ~]# awk 'BEGIN{print 10-10}'
0
[root@m01-shell ~]# awk 'BEGIN{print 10+100}'
110
[root@m01-shell ~]# awk 'BEGIN{print 10+100/2}'
60
[root@m01-shell ~]# awk 'BEGIN{print 10+100/2*4}'
210
[root@m01-shell ~]# echo 10 20
10 20
[root@m01-shell ~]# echo 10 20|awk '{print $1+$2}'
30
5.整数运算案例
案例: 判断我们输入的数字是否为整数
[root@fsf /server/script]# cat count.sh
!/bin/bash
read -p "请输入第一个整数" a
read -p "请输入加减乘除或其他运算符号" c
read -p "请输入第二个整数" b
expr $a + $b &>/dev/null
if [ $? -eq 0 ];then
d=$(awk 'BEGIN{print '$a' '$c' '$b'}')
echo "你要运算的是$a$c$b=$d"
else
echo "你输入的不是整数,或特殊字符未转义"
fi