shell概述:shell是一个命令行解释器,它接收应用程序或用户的命令,然后调用操作系统内核

Linux Shell 种类非常多, 常见的有: Bourne Shell (/usr/bin/sh 或/bin/sh)、 Bourne Again Shell (/bin/bash)、 C Shell (/usr/bin/csh)、 K Shell (/usr/bin/ksh)、 Shell for Root (/sbin/sh) 等。

脚本格式

#!/bin/bash     #表示定义该脚本是一个 shell 脚本(固定格式) 。
#This is my First shell     #说明一下这个脚本是做什么的

执行方式

  • sh 或 bash + 相对或绝对的文件路径(脚本文件不需要 +x执行权限)
  • 直接输入脚本的相对或绝对路径(需授予执行权限 +x)
  • 在脚本的路径前面,使用一个 . 或一个source

shell变量: Shell 变量分为系统变量和自定义变量。系统变量有$HOME、$PWD、$USER等,变量名可以由字母、数字、下划线组成,不能以数字开头。

基本语法

  • 定义变量:变量名=变量值,等号两侧不能有空格,变量名一般习惯用大写。
  • 删除变量:unset 变量名 。
  • 声明静态变量:readonly 变量名,静态变量不能unset。
  • 使用变量:$变量名。

将命令返回值赋给变量(重点)

  • A=ls 反引号,执行里面的命令
  • A=$(ls) 等价于反引号

shell环境变量定义

基本语法

  • export 变量名=变量值,将 Shell 变量输出为环境变量。
  • source 配置文件路径,让修改后的配置信息立即生效。
  • echo $变量名,检查环境变量是否生效

位置参数变量基本语法

  • $n :$0 代表命令本身、$1-$9 代表第1到9个参数,10以上参数用花括号,如 ${10}。
  • $* :命令行中所有参数,且把所有参数看成一个整体。
  • $@ :命令行中所有参数,且把每个参数区分对待。
  • $# :所有参数个数。
#示例 编写 Shell 脚本 xuexi.sh ,输出命令行输入的各个参数信息。
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
#输出各个参数
echo $0 $1 $2 
echo $* 
echo $@ 
echo 参数个数=$#
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 10 20 30
xuexi.sh 10 20
10 20 30
10 20 30
参数个数=3

预定义变量基本语法

  • $$ :当前进程的 PID 进程号。
  • $! :后台运行的最后一个进程的 PID 进程号。
  • $? :最后一次执行的命令的返回状态,0为执行正确,非0执行失败。
#示例 编写 Shell 脚本 学习.sh ,输出命令行输入的各个参数信息。
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
echo 当前的进程号=$$ 
# &:以后台的方式运行程序 
sh hello.sh & 
echo 最后一个进程的进程号=$! 
echo 最后执行的命令结果=$?
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat hello.sh 
#!/bin/bash
echo hello world
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
当前的进程号=11190
最后一个进程的进程号=11191
最后执行的命令结果=0
[root@izb1j05w8ldmtn1ylavvdfz dabao]# hello world

运算符基本语法

  • $((运算式)) 或 $[运算式]
  • expr m + n 注意 expr 运算符间要有空格
  • expr m - n
  • expr *,/,% 分别代表乘,除,取余
# 第1种方式 $(())  
[root@izb1j05w8ldmtn1ylavvdfz dabao]# echo $(((2+3)*4)) 
20
# 第2种方式 $[],推荐  
[root@izb1j05w8ldmtn1ylavvdfz dabao]# echo $[(2+3)*4]
20
# 使用 expr 
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
#使用expr计算
TEMP=`expr 2 + 3` 
echo `expr $TEMP \* 4`
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
20

if 条件语句

#基本语法
if [ 条件判断式 ];then   
    程序   
fi
# 或者(推荐)
if [ 条件判断式 ]
then
    程序
elif [ 条件判断式 ]
then
    程序
fi
#示例1,测试数字大小
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
#测试数字大小
NUM=100
if (( $NUM > 4 )) ;then
echo “this num is $NUM greater 4 ! ”
fi
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
“this num is 100 greater 4 ! ”
#示例2,测试文件是否存在,不存在则创建
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
#测试文件是否存在
if [ ! -e /data/dabao/hello.txt ];then
touch /data/dabao/hello.txt
else
echo “This hello.txt is exist,Please exit ….. ”
fi
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
[root@izb1j05w8ldmtn1ylavvdfz dabao]# ls -lrt
-rw-r--r-- 1 root root         0 Mar 13 16:36 hello.txt
#再次执行
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
“This hello.txt is exist,Please exit ….. ”
#示例3,多个条件进行判断
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
scores=80
if [[ $scores -gt 85 ]]; then
echo "very good!";
elif [[ $scores -gt 75 ]]; then
echo "good!";
elif [[ $scores -gt 60 ]]; then
echo "pass!";
else
echo "no pass!"
fi
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
good!
逻辑运算符解析:
-f 判断文件是否存在 eg: if [ -f filename ]
-d 判断目录是否存在 eg: if [ -d dir ]
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式
-z 空字符

for 循环

基本语法
for 变量名 in 值1 值2 值3...
do
    程序
done
#示例1,打印 seq 数字循环
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
for i in `seq 15`
do
echo “NUM is $i”
done
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
“NUM is 1”
“NUM is 2”
“NUM is 3”
“NUM is 4”
“NUM is 5”
“NUM is 6”
“NUM is 7”
“NUM is 8”
“NUM is 9”
“NUM is 10”
“NUM is 11”
“NUM is 12”
“NUM is 13”
“NUM is 14”
“NUM is 15”

while 循环

基本语法
while [ 条件判断式 ]
do
    程序
done
#示例1,判断数字
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
i=1
while [[ $i -lt 10 ]];do
echo $i
((i++))
done
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
1
2
3
4
5
6
7
8
9

case 分支

基本语法
case $变量名 in
"值1")
如果变量值等于值1,则执行此处程序1
;;
"值2")
如果变量值等于值2,则执行此处程序2
;;
...省略其它分支...
*)
如果变量值不等于以上列出的值,则执行此处程序
;;
esac
#示例1,当命令行参数为1时输出“周一”,2时输出“周二”,3时输出“周三”,4时输出“周四”,5时输出“周五”,其他情况输出“周末”。
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
case $1 in
"1")
echo 周一
;;
"2")
echo 周二
;;
"3")
echo 周三
;;
"4")
echo 周四
;;
"5")
echo 周五
;;
*)
echo 周末
;;
esac
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 3
周三
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh
周末

函数

基本语法
function 函数名(){
语句
........
}
#示例
[root@izb1j05w8ldmtn1ylavvdfz dabao]# cat xuexi.sh 
#!/bin/bash
function name(){
echo "my name is chatgpt"
}
name
[root@izb1j05w8ldmtn1ylavvdfz dabao]# sh xuexi.sh 
my name is chatgpt