目录
一、shell的作用和规范
1.shell的作用
2.shell的执行顺序
3.shell的格式
4.执行shell脚本
1.直接调用shell解释器加上脚本的名字
2.路径加脚本名 绝对路径或相对路径 脚本文件需要有执行权限
3.直接运行
4.其他执行
5.执行环境
二、脚本的错误方式和检查语句
1.命令错误
2.语法错误
3.逻辑错误
4.检查语句
三、重定向与shell脚本变量
1.重定向
2.shell变量
1.变量
2.变量的类型
3.命名要求
4.特殊符号
5.预定义变量(详解)
四、脚本语句
1.read -p 从键盘输入的内容变成变量
2.变量作用范围
3.整数的运算
4.管道符
5.随机数生成器变量
6.编写脚本
总结:本章主要介绍shell脚本的基础知识以及部分基础脚本
一、shell的作用和规范
1.shell的作用
将高级语言翻译成二进制,也可以将二进制翻译成高级语言
写一个命令集合,用bash(shell)去翻译给硬件执行
2.shell的执行顺序
1.顺序执行
2.选择执行
3.循环执行
3.shell的格式
1.#!/bin/bash 代表声明解释器,使用什么解释器(shell)
2.注释信息:以#开头的代表注释信息
3.可执行语句
4.执行shell脚本
1.直接调用shell解释器加上脚本的名字
bash [脚本名] 不需要脚本文件有执行权限
2.路径加脚本名 绝对路径或相对路径 脚本文件需要有执行权限
./ [脚本名]
3.直接运行
直接运行需要加入到$PATH中(全局运行和补全)
4.其他执行
source和.也可以执行
5.执行环境
source 和 . 执行脚本会改变当前环境(进程)
bash 和 ./ 不会改变当前环境会生成一个新环境(进程)
6.查看本机的shell信息
cat /etc/shells
二、脚本的错误方式和检查语句
1.命令错误
不会影响接下来的命令执行,但本条命令不执行
2.语法错误
直接影响脚本无法正常运行
3.逻辑错误
可以正常运行但最终结果不是本来的结果
4.检查语句
bash -x [脚本文件名] 执行脚本并排查错误
bash -n [脚本文件名] 检查语法错误但行数不一定准确
set -e 一旦出错立即停止 用法:写入脚本文件中
set -u 变量不存在不执行 用法:写入脚本文件中
三、重定向与shell脚本变量
1.重定向
重定向就是改变电脑数据的输出方向
电脑的默认输出方向是屏幕
写入指令让电脑执行,电脑打印结果在屏幕上,称为标准输出如果电脑未打印出正确的结果称为错误输出
通过键盘,鼠标,扫描仪,话筒,等设备输入给电脑的指令称为标准输入
改变输出方向
1.输出到别的终端上
先使用 tty 命令查看终端信息
再使用 ls > /dev/pts/0
2.输入到文件中
ls > test
重定向输入 < 从指定文件读取数据,不从键盘输入
重定向输出 > 将输出结果保存到指定的文件(覆盖原有内容)
>> 将输出结果追加到指定的文件尾部
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
2>> 将错误信息追加到指定的文件中
混合输出 &> 将标准输出,标准错误输出的内容保存到同一个文件中
2.shell变量
1.变量
变量:值可以变化
常量:值不可以变化
shell不分数据类型,所有的数据类型都是字符串
设置变量
变量名=变量值 两边没有空格
调用变量
echo $变量名
删除变量
unset 变量名
重新定义变量
变量名=变量值
追加变量值
变量名+=变量值
2.变量的类型
1自定义的变量
2预定义变量($?,$$,$*,$@这些是shell中自带的)
3环境变量(env可以看到所有的环境变量)
4只读变量(只可以读不可以改)
变量值不允许修改(重新赋值)的情况
无法使用unset删除
最快方法重启
name=zf15
readonly name
echo $name
unset name
echo $name
name=zf
5位置变量($1...$n)
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
vim 1.sh
#!/bin/bash
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
echo "$*" 将所有项当成一个值
echo "$@" 所有项
echo "$0" 脚本自身
echo "$#" 后面参数的个数
./1.sh {1..10}
3.命名要求
1区分大小写
2不能使用程序中的保留字和内置变量
3只能用字母,数字及下划线且不能以数字开头,不支持短横线"-"
4不要使用内置的变量,使用英文尽量使用词义
5大驼峰 StudentFirstName
6小驼峰 studentFirstName
7下划线 student_name
4.特殊符号
${} 定义变量名的范围
" " 变量在双引号中可以识别(弱引用)
' ' 变量在单引号中不被识别(强引用)
` ` 反撇号代表引用命令执行的结果效果等于$()
5.预定义变量(详解)
$? 代表上一次命令的执行结果为0代表正确,非0代表错误
$0 代表脚本的文件名 如 bash $0 代表再执行一次本脚本如果写入脚本就会一直执行无限循环
$$ 代表当前bash的pid号
$# 代表位置参数的总个数
$* 代表返回所有参数并且所有参数当成一个整体返回
$@ 代表返回所有参数并且所有参数是独立的个体返回
四、脚本语句
1.read -p 从键盘输入的内容变成变量
read -p "现在的时间是:" time
echo $time
vim 1.sh
#!/bin/bash
echo -n "请输入你的姓名:"
read info
echo 你的姓名是:$info
bash 1.sh
2.变量作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用
格式1:export 变量名
格式2:export 变量名=变量值
可以使用pstree 查看shell的环境
输入bash进入子shell
ctrl+D组合exit 退出子shell
abc=123
echo $abc
bash
echo $abc
exit
echo $abc
export abc=123
bash
echo $abc
3.整数的运算
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2
运算符:
加法 +
减法 -
乘法 \*
除法 /
取余 %
expr 1+2
expr 1 + 2
a=20
b=30
expr $a + $b
expr $a - $b
expr $a \* $b
expr $b / $a
expr $b % $a
expr 1 + 2 \* 3
expr 2 \* $[ 3 + 1 ]
a=1
b=2
let c=a+b
echo $c
i=1
let i++
echo $i
i=1;let i++;echo $i
i=100;let ++i;echo $i
i=100;let j=i++;echo $i $j
i=100;let j=++i;echo $i $j
i++ 是先赋值给j后再加 ++i是加后再赋值
4.管道符
管道符 |
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
ls /opt |wc
grep "/bin/bash$" /etc/passwd
grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'
5.随机数生成器变量
$RANDOM 取值范围:0-32767
echo $[RANDOM%34+1] 生成随机数范围在35以内
echo -e "\E[1;30mhello\E[0m" 生成灰色hello
echo -e "\E[1;$[RANDOM%7+31]mhello\E[0m" 生成随机颜色的hello
echo $(expr $RANDOM % 33 + 1) 生成随机数范围在34以内
6.编写脚本
vim xinxi.sh
#!/bin/bash
echo "请输入你的姓名"
read num1
echo "你的姓名是$num1"
bash xinm.sh
chmod +x xinm.sh
./xinm.sh
vim 3.sh
#!/bin/bash
read -p "请输入第一个整数:" num1
read -p "请输入第二个整数:" num2
sum=`expr $num1 + $num2`
echo "运算结果为:$sum"
bash 3.sh
vim system.sh
#!/bin/bash
ip=`ifconfig ens33|grep netmask|tr -s " " |cut -d " " -f3`
cpu=`lscpu |grep 型号名称|cut -d":" -f2|tr -s " "`
mem=`free -h|grep Mem|tr -s " " |cut -d " " -f2`
disk=`lsblk |grep disk|tr -s " " |cut -d" " -f4`
echo "--------------------- systeminfo----------------------"
echo "你的ip地址是: ${ip} "
echo "你的主机名是: $(hostname) "
echo "你的系统版本是: $(cat /etc/redhat-release) "
echo "你的cpu型号是: $cpu "
echo "你的内存大小是: $mem "
echo "你的磁盘大小是: $disk "
echo "------------------------------------------------------"
bash system.sh