shell 脚本语法
发布时间 - 2025-07-15 00:00:00 点击率:次shell脚本概述:本质上是一个包含特定格式指令的文件,这些指令可以由系统的脚本解析器翻译并执行,无需编译。它充当系统内核与用户之间的沟通桥梁。
Shell既是应用程序,又是一种脚本语言,应用程序通过解析脚本语言来执行命令。系统提供了多种Shell命令解析器,如sh、ash、bash等。可以通过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 |
是否是非空字符串 |
testtest [ ] [ ]
返回值为True则$?为0,否则非零。
比较运算符用于数字比较:
| 运算符 | 英文 | 含义 |
|---|---|---|
-eq |
equal | 相等 |
-ne |
not equal | 不相等 |
-gt |
greater than | 大于 |
-ge |
greater equal | 大于等于 |
-le |
less equal | 小于等于 |
-lt |
less than | 小于 |
逻辑运算符用于组合条件:
| 运算符 | 英文 | 含义 |
|---|---|---|
&& 或 -a
|
and | 与操作 |
|| 或 -o
|
or | 或操作 |
! |
not | 非操作 |
控制语句包括if、case、for、while和until。
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 donefor 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约束提示词写法【教程】
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南

