shell脚本
一、shell概述
shell 是用户和 Linux 内核之间的接口程序
1、用户在提示符下输入的命令都由 shell 先解释然后传给 Linux 核心;
2、它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行;
3、Linux 系统中提供了好几种不同的 shell 命令解释器,如 sh、ash、bash 等。一般默认使用 bash 作为默认的解释器;
4、shell 是用户跟内核通信几种方式的一种。
作为程序设计语言:它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支完成类似于 windows 下批处理操作,简化我们对系统的管理与应用程序的部署称之为shell 脚本。
c/c++等语言,属于编译性语言(编写完成后需要使用编译器完成编译、汇编、链接等过程变为二进制代码方可执行);shell 脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装 shell 命令解释器的环境下执行
shell 脚本主要用于:帮助开发人员或系统管理员将复杂而又反复的操作放在一个文件中,通过简单的一步执行操作完成相应任务, 从而解放他们的负担。
二、shell语法
2.1 shell 脚本的定义与执行
shell脚本的代码编写流程
第一步:指定shell脚本文件,一般以.sh作为后缀名,也可以不加,例如:test.sh
#!/bin/bash # #!用于指定当前脚本文件的shell解释器的类型,如不写,则用默认的shell #shell脚本是shell命令的有序集合,代码的构成就是命令 ls pwd echo "hello world"
chmod +x test.sh
./test.sh 增加可执行权限后执行
bash test.sh 直接指定使用 bash 解释 test.sh
. test.sh(或source test.sh) 使用当前 shell 读取解释 test.sh
三种执行脚本的方式不同点:
./和 bash 执行过程基本一致,后者明确指定 bash 解释器去执行脚本,脚本中#!指定的解释器不起作用前者首先检测#!,使用#!指定的 shell,如果没有使用默认的 shell
用./和 bash 去执行会在后台启动一个新的 shell 去执行脚本
用.去执行脚本不会启动新的 shell,直接由当前的 shell 去解释执行脚本。
2.2 变量
2.2.1 自定义变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #!/bin/bash #定义变量 #shell脚本中没有数据类型可言,所以定义变量时不需要加数据类型 #shell脚本中,赋值操作时不能在等号两边加空格 #NUM = 100 #错误 NUM=100 #引用变量 # $变量名 取一个变量的值 i=$NUM #显示变量 echo $NUM echo $i #清除变量 unset NUM echo "*************" echo $NUM #使用read从终端读取数据保存在变量中 read str echo "str = $str" #使用readonly创建一个只读的变量 readonly n=999 echo "n = $n" #指定变量初始化后不能再次修改变量的值,只能使用 #n=666 #echo "n = $n" |
2.2.2 环境变量
MYVAL=999 export MYVAL
#!/bin/bash echo "You are welcome to use bash" echo "Current work dirctory is $PWD" echo "the host name is $HOSTNAME" echo "your home dir $HOME" echo "Your shell is $SHELL" echo "user env val is $MYVAL1"
2.2.3 预设变量
#! /bin/bash #位置变量$0 ‐ $9 保存从终端输入的每一个参数 echo "\$0 = $0" echo "\$1 = $1" echo "\$2 = $2" echo "\$5 = $5" echo "\$6 = $6" echo "\$7 = $7" echo "\$8 = $8" echo "\$9 = $9" #如果超过9,需要加大括号 echo "\$10 = ${10}" #$#:保存命令行传入的参数的个数,不包括$0 echo "\$# = $#" #$@或者$*:保存所有的命令行传入的参数,但是不包括$0 echo "\$@ = $@" echo "\$* = $*" #$$:获取当前进程的进程号 echo "\$$ = $$" #read NUM # $? 返回上一个命令执行的结果,如果执行成功,则$?的值为0,执行失败,则为非0 ls echo "\$? = $?" ls asdfasdf echo "\$? = $?"
2.2.4 脚本变量的特殊用法
#!/bin/bash name="zhangsan" #双引号里面的特殊字符,会使用其特殊含义 string1="good moring $name" #单引号里面的特殊字符,都会失去特殊含义 string2='good moring $name' echo $string1 echo $string2
#反引号:获取一个shell命令的输出结果,一般对有输出结果的命令经常去使用,也可以使用$()与反引号等价 echo "today is date" echo "today is `date`" echo 'today is `date`' echo "My dir is $(ls)"
#转义字符:使用时,需要在echo后面加上‐e选项 echo "**************" echo "this \n is\ta\ntest" echo ‐e "this \n is\ta\ntest" echo "**************"
num=100 #由子shell来完成,不影响当前shell中的变量 ( num=999;echo "1 $num" ) echo 1:$num #在当前shell中执行,会影响当前变量 { num=666; echo "2 $num"; } echo 2:$num
2.3 条件测试语句
2.3.1 文件测试
#! /bin/bash echo "please input a filename >>> " read FILE test ‐e $FILE echo "存在?$?" test ‐s $FILE echo "非空?$?" [ ‐r $FILE ] echo "可读?$?" [ ‐w $FILE ] echo "可写?$?" [ ‐x $FILE ] echo "可执行?$?" test ‐b $FILE echo "块设备文件?$?" test ‐c $FILE echo "字符设备文件?$?" test ‐d $FILE echo "目录文件?$?" test ‐f $FILE echo "普通文件?$?" test ‐L $FILE echo "软链接文件?$?" test ‐S $FILE echo "套接字文件?$?" test ‐p $FILE echo "管道文件?$?"
#! /bin/bash test "hello" = "hello" echo "相等?$?" test "hello" = "hella" echo "相等?$?" test "hello" != "hello" echo "不相等?$?" test "hello" != "hella" echo "不相等?$?" test ‐z "hello" echo "长度是否为0?$?" test ‐n "hello" echo "长度是否不为0?$?"
2.3.3 数字测试

#! /bin/bash echo "please input two numbers >>> " read NUM1 NUM2 test $NUM1 ‐eq $NUM2 echo "相等?$?" test $NUM1 ‐ne $NUM2 echo "不相等?$?" test $NUM1 ‐gt $NUM2 echo "大于?$?" test $NUM1 ‐ge $NUM2 echo "大于等于?$?" test $NUM1 ‐lt $NUM2 echo "小于?$?" test $NUM1 ‐le $NUM2 echo "小于等于?$?"
-a |
(and)两状况同时成立! test -r file -a -x file file 同时具有 r 与 x 权限时,才为 true. |
-o |
(or)两状况任何一个成立! test -r file -o -x file file 具有 r 或 x 权限时,就传回 true. |
! |
相反状态 test ! -x file 当 file 不具有 x 时,回传 true. |
#! /bin/bash num=100 #判断 0 <= num <= 200 #test $num ‐ge 0 && test $num ‐le 200 test $num ‐ge 0 ‐a $num ‐le 200 echo "$?" #判断 num <= 0 或者 num >= 200 test $num ‐le 0 || test $num ‐ge 200 echo "$?" file="file.txt" #判断文件是否不是普通文件 test ! ‐f $file echo "$?"
#判断文件是否存在并且是否是目录文件 test ‐e $file && test ‐d $file echo "$?"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~