shell 脚本语法

发布时间 - 2025-07-15 00:00:00    点击率:

shell脚本概述:本质上是一个包含特定格式指令的文件,这些指令可以由系统的脚本解析器翻译并执行,无需编译。它充当系统内核与用户之间的沟通桥梁。

Shell既是应用程序,又是一种脚本语言,应用程序通过解析脚本语言来执行命令。系统提供了多种Shell命令解析器,如shashbash等。可以通过echo $SHELL命令查看当前Linux系统的默认解析器。

$ echo $SHELL
/bin/bash

在Windows系统中,可以通过which sh命令查看sh命令的路径。

> which sh
/usr/bin/sh

Shell脚本是一种脚本语言,我们只需使用任意文本编辑器,按照语法编写相应程序,增加可执行权限,即可在安装Shell命令解释器的环境下执行。基本用法开头是#!/bin/bash,其中#!用来声明脚本由什么Shell解释,否则使用默认Shell。

系统在打开终端时会自动调用/etc/profile~/.bashrc文件。/etc/profile为系统的每个用户设置环境信息,当用户第一次登录时执行,设置系统的公共环境变量和自启动程序。~/.bashrc位于用户自己的家目录中,登录时和打开任意终端时都会自动调用。通过命令行输入sh,可以进入Shell指令状态。

>sh
sh-4.4$ echo hello world
hello world
sh-4.4$

执行Shell脚本需要当前用户具有可执行权限,可以通过chmod +x xxxx.sh命令增加权限。

Shell脚本有三种执行方式:

执行方式 含义
./xxx.sh 优先按照文件中#!指定的解析器解析,如果指定的解析器不存在,使用系统默认的解析器。
bash xxx.sh 指明先用bash解析器解析,如果bash不存在,使用默认解析器。
. xxx.sh 直接使用默认解析器解析。

Windows脚本在Linux上运行时会报错,因为换行符定义不同,可以使用dos2unix插件调整脚本格式。

sudo apt-get install dos2unix
dos2unix 

也可以使用vi编辑器,执行:set ff=unix,将文本转为Unix格式。

变量在Shell脚本中的使用包括普通变量和环境变量。定义普通变量的语法为:

变量名=变量值

引用变量使用$变量名。清除变量使用unset 变量,定义只读变量使用readonly 变量名=变量值

#!/bin/bash
num=8
echo 显示变量 $num
unset num
echo 清除变量 $num
-->
$ ./test.sh
显示变量 8
清除变量

交互式输入变量使用read命令:

read -p "显示的字符串" [变量名1 变量名2 变量名3 ...]
#!/bin/bash
read -p "输入三个数字: " a b c
echo $a
echo $b
echo $c
-->
$ ./test.sh
输入三个数字: 12 34 56
12
34
56

查看环境变量使用env命令:

#!/bin/bash
env
-->
$ ./test.sh
USERDOMAIN=VVD
OS=Windows_NT
COMMONPROGRAMFILES=C:\Program Files\Common Files
PROCESSOR_LEVEL=6
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
CommonProgramW6432=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
_=/usr/bin/env
MSYSTEM_CARCH=x86_64
DISPLAY=needs-to-be-defined...

系统变量值可以直接使用$获取:

#!/bin/bash
echo $OS
-->
$ ./test.sh
Windows_NT

变量名只能包含英文字母和下划线,不能以数字开头。等号两边不能直接接空格符,若变量中本身包含空格,则整个字符串需用双引号或单引号括起来。双引号可以解析变量的值,单引号则不能。

#!/bin/bash
num=200
echo "num=$num" #$num当成变量的值处理
echo 'num=$num' #$num当成字符串处理

修改环境变量以常用的修改系统路径为例:

export PATH=$PATH:

Shell直接提供无需定义的预设变量:

变量 含义
$# 传给Shell脚本参数的数量
$* 传给Shell脚本参数的内容
$1,$2 运行脚本时传递给其的参数,用空格隔开
$? 命令执行后返回的状态,用于检查上一个命令执行是否正确
$0 当前执行的进程名
$$ 当前进程的进程号

脚本标量的特殊用法:

标记 含义
"" 双引号包含的变量会被解释
'' 单引号包含的变量会当做字符串
``(反引号) 反引号中的内容作为系统命令,并执行其内容
\\ 转义字符,如\n\t\r\a
(命令序列) 由子Shell来完成,不影响当前Shell中的变量
{命令序列} 在当前Shell中执行,会影响当前变量

变量的扩展判断变量是否存在:

${num:-val} 如果num存在,整个表达式的值为num,否则为val

字符串操作包括定义、测量长度、提取子字符串和替换字符:

str="hehe: haha: xixi:lala"
echo "str的长度为:${#str}"
-->
str的长度为:21

echo ${str:3} --> e: haha: xixi:lala

echo ${str:3:6} --> e: hah

echo ${str/:/#} --> hehe# haha: xixi:lala

条件测试使用test命令,用于测试字符串、文件状态和数字。test命令有两种格式:

test condition 或 [ condition ]

文件测试用于测试文件状态的条件表达式:

参数 含义
-e 是否存在
-d 是否是目录
-f 是否是文件
-r 是否可读
-w 是否可写
-x 是否可执行
-L 是否符号连接
-c 是否字符设备
-b 是否块设备
-s 是否文件非空

若返回为True则$?为0,否则非零。

#!/bin/bash
[ -e a ]
echo $?
[ -e bbb ]
echo $?
-->
0
1

字符串操作符用于比较字符串:

操作符 含义
= 两个字符串相等
!= 两个字符串不相等
-z 是否是空字符串
-n 是否是非空字符串
test 
test 
[  ]
[  ]

返回值为True则$?为0,否则非零。

比较运算符用于数字比较:

运算符 英文 含义
-eq equal 相等
-ne not equal 不相等
-gt greater than 大于
-ge greater equal 大于等于
-le less equal 小于等于
-lt less than 小于

逻辑运算符用于组合条件:

运算符 英文 含义
&&-a and 与操作
||-o or 或操作
! not 非操作

控制语句包括ifcaseforwhileuntil

if [条件1]; then
执行第一段程序
elif [条件2];then
执行第二段程序
else
执行第三段程序
fi
case $变量 in
变量1 | 变量2 | 变量3 ... )
执行代码段一
变量4 | 变量5 ... )
执行代码段二
*)
执行默认代码段
esac
for ((初始值; 条件值; 执行步阶))
do
代码段
done
-->
for ((i=0; i<5; i++))
do
echo $i
done

for var in con1 con2 con3 ... do 代码段 done --> for i in 1 2 3 4 5 do sum=$sum+$i done

while [  ]
do
代码段
done
until [  ]
do
代码段
done

break用于跳出循环体,continue用于跳出当前循环步骤,立即开启下一次循环。

函数定义和调用:

函数名 () {
代码段
}

function 函数名() { 代码段 }

函数名 para1 para2 ...

使用参数与一般脚本中使用参数相同,可以使用return返回值,默认无错误返回0,否则返回1。导入函数可以在fun.sh中定义的函数可以在其他sh文件中引用:

source fun.sh

参考资料:https://www./link/ccc83cd199e289db77c9271ab00c35a0


# linux  # windows  # ai  # shell脚本  # bash  # echo  # 运算符  # 比较运算符  # 逻辑运算符  # if  # for  # while  # break  # continue  # 字符串  # 循环  # https  # unix  # 变量名  # 可以通过  # 可以使用  # 可执行  # 英文  # 不存在  # 单引号  # 双引号  # 变量值 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 教你用AI将一段旋律扩展成一首完整的曲子  网页设计与网站制作内容,怎样注册网站?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  如何在宝塔面板中修改默认建站目录?  用yum安装MySQLdb模块的步骤方法  手机软键盘弹出时影响布局的解决方法  微信小程序 闭包写法详细介绍  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Python数据仓库与ETL构建实战_Airflow调度流程详解  Android中AutoCompleteTextView自动提示  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  制作电商网页,电商供应链怎么做?  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  Laravel如何实现API资源集合?(Resource Collection教程)  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel如何实现文件上传和存储?(本地与S3配置)  如何获取免费开源的自助建站系统源码?  企业网站制作这些问题要关注  详解jQuery停止动画——stop()方法的使用  android nfc常用标签读取总结  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  在线制作视频网站免费,都有哪些好的动漫网站?  python中快速进行多个字符替换的方法小结  如何快速搭建高效香港服务器网站?  黑客入侵网站服务器的常见手法有哪些?  QQ浏览器网页版登录入口 个人中心在线进入  制作旅游网站html,怎样注册旅游网站?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  高防服务器租用指南:配置选择与快速部署攻略  如何快速搭建高效服务器建站系统?  网站制作报价单模板图片,小松挖机官方网站报价?  linux写shell需要注意的问题(必看)  如何用AI帮你把自己的生活经历写成一个有趣的故事?  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  Thinkphp 中 distinct 的用法解析  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  javascript中对象的定义、使用以及对象和原型链操作小结  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  如何在阿里云域名上完成建站全流程?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  iOS中将个别页面强制横屏其他页面竖屏  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  成都网站制作公司哪家好,四川省职工服务网是做什么用?  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  Claude怎样写约束型提示词_Claude约束提示词写法【教程】  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南