Linux的shell语法

Linux的shell脚本

1.概述

shell解释器,介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。

image-20231017102041346

查看Linux的shell解释器

[root@localhost ~]# cat /etc/shells 
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bashbin -> usr/bin   所以上面2个解释器和下面2个解释器是同一个
sh -> bash       所以上面4个其实本质就是1个1978年 sh解释器   1987年 bash解释器

2 第一个shell脚本

案例
编写shell脚本
[root@localhost opt]# vim demo.sh
[root@localhost opt]# cat demo.sh 
#! /bin/bash        该行是注释,但是告诉操作系统使用/bin/bash解释器来执行下面代码echo 'hello world!'执行
sh 文件名
授予执行权限
./文件名
source 文件名

3 变量

变量的命名规则:
1.不能以数字开头
2.严重区分大小写
3.不能是关键字
4.知名见义
5.可以是字母数字下划线
6.驼峰命名法:StudentName

3.1 变量的声明

变量名=值                值的类型有字符串 数字 数组echo $变量名
注意:1.声明变量时=符号两边不能有空格 如: age=342.使用变量时必须前面加$   如: echo $age

3.2 变量的单引号

[root@localhost opt]# s='我今年$age'
[root@localhost opt]# echo $s
我今年$age注意:单引号里面的内容不能是引用某个变量

3.2 变量的双引号

[root@localhost opt]# s1="我今年$age"
[root@localhost opt]# echo $s1
我今年34注意:双引号里的内容可以引用变量

3.3变量的``

[root@localhost opt]# s2="现在的时间是:`date`"
[root@localhost opt]# echo $s2
现在的时间是:2024年 06月 21日 星期五 10:27:16 CST注意:反单引号``里面是直接作为命令执行

3.4变量的{}

[root@localhost opt]# echo "我今年的age是:${age}aaaa"
我今年的age是:34aaaa
注意:大括号可以告诉操作系统,变量的边界在哪里

3.5 只读变量

[root@localhost opt]# readonly num6=6
[root@localhost opt]# num6=7
-bash: num6: 只读变量注意:只读变量,无法删除,无法修改,停止shell脚本或者关闭shell窗口,只读变量就会消失

3.6 删除变量

[root@localhost opt]# unset age
[root@localhost opt]# echo $age注意:变量删除后,就不存在了,输出没有内容

4 输出

echo 内容/$变量printf   默认不输出换行符
[root@localhost opt]# printf '%d %s %f' $num1 $num2 $num3
1 2 3.000000[root@localhost opt]# printf '%d %s %f\n' $num1 $num2 $num3
1 2 3.000000
[root@localhost opt]#

5 输入

read -p 提示信息 变量名1 变量名2 变量名3
输入值:  值1 值2 值3[root@localhost opt]# read -p "请输入一个数:" num1 num2
请输入一个数:1 2 3
[root@localhost opt]# echo $num1
1
[root@localhost opt]# echo $num2
2 3[root@localhost opt]# read -p "请输入一个数:" num1 num2 num3
请输入一个数:1 2
[root@localhost opt]# echo $num1
1
[root@localhost opt]# echo $num2
2
[root@localhost opt]# echo $num3[root@localhost opt]# 

6 位置变量

$1 $2 $3 ... ${10} ${11}[root@localhost opt]# cat demo.sh 
#! /bin/bash
# 这是注释
echo "第一个数为:$1,第二个数为:$2"[root@localhost opt]# ./demo.sh 1 2
第一个数为:1,第二个数为:2$1 取第一个值
$2 取第二个值
$3 取第三个值
...

7 预定义变量

$0  文件名
$?  脚本执行结果,执行正常是0,不正常会报错或者其他值
$*  所有传入实参的值
$#  所有传入实参的个数[root@localhost opt]# cat demo.sh 
#! /bin/bash
# 这是注释
echo "$0"
echo "$?"
echo "$*"
echo "$#"[root@localhost opt]# sh demo.sh 4 5 6 7
demo.sh
0
4 5 6 7
4

8 环境变量

8.1 变量的作用域

  • 局部变量:只作用于当前区域
  • 全局变量:作用域所有地方
声明局域变量时,正常写就是
声明全局变量时,需要在变量前加export     声明后执行bash不管是局部变量还是全局变量,执行完shell脚本或关闭shell窗口都会消失,如果想一直存在需要持久化

8.2 持久化变量

想要让变量持久化,不消失,需要把变量写入到环境变量文件中/etc/profile     针对所有用户
~/.bash_profile  针对当前所有PATH=$PATH:$HOME/binexport PATH
export JAVA_HOME=/opt/jdk
export PATH=$PATH:$JAVA_HOME/bin/
export NC_HOME=/opt/netcat-0.7.1
export PATH=$PATH:$NC_HOME/bin
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/jdk/bin/:/opt/netcat-0.7.1/bin
[root@localhost ~]# echo $JAVA_HOME
/opt/jdk

9 案例:使用shell编写一个安装jdk脚本

公司上班,10台服务器需要安装jdk,如果一台一台安装浪费大量的时间,使用shell脚本编写好后,直接运行脚本即可完成安装

1.准备工作
理清楚接下来我们要做的事情
- 上传jdk的安装包     优化 使用在线下载 wget....
- 解压安装包,出现一个新的目录
- 去/root/.bash_profile写入环境变量的值 或/etc/profile
- 刷新一下环境变量文件2.开始脚本[root@localhost opt]# cat demo.sh 
#! /bin/bash# 定义一些变量,保存jdk安装的相关路径或名字
jdk_package_name='jdk-8u231-linux-x64.tar.gz'
jdk_name='jdk1.8.0_231'
install_path='/opt/'echo '开始安装jdk···'tar -zxvf ${jdk_package_name}echo "配置环境变量···"
cat >> /root/.bash_profile <<EOF
export JAVA_HOME=${install_path}${jdk_name}
export PATH=\$PATH:\$JAVA_HOME/bin/
EOFecho "刷新环境变量配置文件···"
source /root/.bash_profileecho "安装完毕!"

10 运算符

10.1 算术运算符

+  加法
-  减法
*  乘法
/  除法
%  余数[root@localhost ~]# a=1
[root@localhost ~]# b=2
[root@localhost ~]# echo $a+$b
1+2
[root@localhost ~]# echo $(($a+$b))
3
[root@localhost ~]# echo $(($a-$b))
-1
[root@localhost ~]# echo $(($a*$b))
2
[root@localhost ~]# echo $(($a/$b))
0
[root@localhost ~]# echo $(($a%$b))
1echo `expr $a + $b`  # +两边必须有空格
echo $(expr $a + $b)  # +两边必须有空格
echo $(expr $a \* $b) # 乘法需要是有右斜杠

10.2 比较运算符

> 
<
>=
<=
==
!=

image-20240621142428931

10.3 逻辑运算符

&&||!if [ "var1" -eq 1 ] && [ "var2" -gt 2 ];thenecho "输出内容"
fiif [ "var1" -eq 1 ] || [ "var2" -gt 2 ];thenecho "输出内容"
fiif ! [ "var1" -eq 1 ];thenecho "输出内容"
fi

11 数据类型

python:数字型 字符串 列表 元祖 集合 字典

shell:数字 字符串 数组

声明数组
变量名=(值1 值2 值3...)新增
变量名[索引值]=值
索引值不存在就是新增
[root@localhost ~]# ss=(1 2 3)
[root@localhost ~]# ss[3]=4
删除
unset 变量名[索引值]
[root@localhost ~]# unset ss[0][root@localhost ~]# echo ${ss[*]}   查询整个数组内容
[root@localhost ~]# echo ${ss[0]}   根据索引值查询某个成员
1
[root@localhost ~]# echo ${ss[1]}
2
[root@localhost ~]# echo ${ss[2]}
3
[root@localhost ~]# echo ${ss[3]}
4
[root@localhost ~]# echo ${#ss[*]}  #查询数组内的成员个数
4改
变量名[索引值]=值
索引值存在就是修改
[root@localhost ~]# ss[0]=99
[root@localhost ~]# echo ${ss[*]}
99 2 3 4

12 分支结构

shell的if语句里,条件可以用(()),[],[[]]
(())主要用于算术比较
例如:if ((10>5));then echo "yes";fi
[]用于字符串比较和文件测试
例如:if [ "$a" = "$b" ];then echo "等于";fi
[[]]bash特有的拓展,提供更强大和灵活的字符串比较和模式匹配功能
例如:if [[ "$a" = "$b" ]];then echo "等于";fi
12.1 单分支
语法:
if 条件
then 执行语句
fi示例
if (($1>5))
thenecho "这个数大于5"
fiif [ $1 -eq 5 ]
thenecho "这个数等于5"
fi
12.2 双分支
语法:
if 条件
then 执行语句
else执行语句
fi示例
if [ $1 -eq 5 ]
thenecho "这个数等于5"
elseecho "这个数不是5"
fi
12.3 多分支
语法:
if 条件
then 执行语句
elif 条件
then执行语句
elif 条件
then执行语句
else执行语句
fiif [ $1 -eq 5 ]
thenecho "这个数等于5"
elif [ $1 -gt 5 ]
thenecho "这个数大于5"
elseecho "这个数小于5"
fi

练习:用户输入用户名、密码,如果admin/123456,就输出登录成功,否则输出登录失败

#! /bin/bashread -p "输入用户名:" username
read -p "输入密码:" passwdif [ "$username" == "admin" ]
thenif [ "$passwd" == "123456" ]thenecho "登录成功"elseecho "登录失败"fi
elseecho "登录失败"
fi
12.4 case语句
case $变量 in
值1)
执行语句
;;
值2)
执行语句
;;
*)
执行语句
esac案例:输入一个字符,字符为清华输出清华大学,输入北大,输出北京大学,输入其他字段,输出其他大学#! /bin/bashread -p "输入大学名称:" s
case $s in
"清华")echo "清华大学"
;;
"北大")echo "北京大学"
;;
*)echo "其他大学"
esac

13 循环结构

13.1 for循环

语法
for 变量 in 取值列表
do
循环体
done# 类似于C语言风格
for ((条件初始值;循环结束值;条件的改变))
do
循环体
done示例:输出1-10数
[root@localhost opt]# cat demo4.sh 
#! /bin/bashfor i in {1..10}
doecho $i
done示例:计算1-100的和
[root@localhost opt]# cat demo5.sh 
#! /bin/bashsum=0
for i in {1..100}
dosum=$(($sum+$i))
done
echo $sum示例:使用shell编写扫描ip主机代码
#! /bin/baship="192.168.2."
for i in {1..255}
doipaddr=${ip}${i}info=`ping -c 1 -W 1 $ipaddr`if [[ "$info" == *"ttl"* ]]; thenecho "${ipaddr}存在"elseecho "${ipaddr}不存在==============="fi
done

13.2 while循环

语法:

while 条件
do 
循环体
done案例:猜数游戏#! /bin/bash
# num=$[RANDOM%101] 生产一个0-100的整数
num=$[RANDOM%101]
echo $numread -p "请输入一个数:" input
while [ $num != $input ]
do
if (($num > $input));thenecho "猜小了"
elseecho "猜大了"
fi
read -p "请输入一个数:" input
done
echo "恭喜,猜中了!这个数是:$num"

13.3 循环关键字

  • break 终止整个循环
  • continue 终止本次循环
  • exit 终止整个脚本
#! /bin/bashnum=$RANDOM
echo $num
count=0
read -p "请输入一个数:" input
while [ $num != $input ]
do
if (($num > $input));thenecho "猜小了"
elseecho "猜大了"
fi
((count++))
# count=$(($count+1))
# read -p "请输入一个数:" input
if [ $count == 3 ];thenbreak
fi
read -p "请输入一个数:" input
done
if [ $count != 3 ];thenecho "恭喜,猜中了!这个数是:$num"
elseecho "失败了,这个数是:$num"
fi

14 函数

语法:

[function] 函数名([形参]){
函数体
[return 值]
}无参无返
有参无返
无参有返
有参有返
特别注意返回值只能是整数案例:计算2个数的和
#! /bin/bashadd(){
s=$(($1+$2))
echo $s
}# 调用函数
add 1 10#! /bin/bashadd(){
s=$(($1+$2))
return 1
}# 调用函数
add 1 10
if [ $? -eq 0 ];then
echo "aaa"
else
echo "bbb"
fi

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于使用绿联 USB-A转RJ45 2.5G网卡提速的解决问题

问题 网络下载速率低 我的自带网卡是 I219v 在嵌入了2.5G网络后一直无法到达1.5G以上。 平均测速300~500M 解决方案 更新了USB的网卡驱动 禁用了 I219-V的驱动。测速即可 USB下载地址 https://download.csdn.net/download/qq_28198181/89468806

库卡机器人减速机维修齿轮磨损故障

一、KUKA机器人减速器齿轮磨损故障的原因 1. 润滑不足&#xff1a;润滑油不足或质量不佳可能导致齿轮磨损。 2. 负载过重&#xff1a;超过库卡机械臂减速器额定负载可能导致齿轮磨损。 3. 操作不当&#xff1a;未按照说明书操作可能导致KUKA机器人减速器齿轮磨损。 4. 维护不足…

替换或重写Tomcat内置的404页面

替换或重写Tomcat内置的404页面 准备一个Tomcat隐藏Tomcat的相关信息纯净版的Tomcat解决Tomcat启动乱码的问题 替换或重写Tomcat内置的404页面创建新的首页和错误页面页面代码如下所示&#xff1a;创建首页index.html创建error_404.html页面创建其他错误页面创建编写web.xml&am…

当Windows台式电脑或笔记本电脑随机关机时,请先从这8个方面检查

序言 你的Windows笔记本电脑或PC是否意外关闭?笔记本电脑电池故障、电源线松动、过热、电源设置错误、驱动程序过时或电脑组件故障等问题都可能是罪魁祸首。如果你对这个问题感到沮丧,试试这些解决方案。 进行一些初步检查 与从电池中获取电力的笔记本电脑不同,台式电脑依…

移动端+PC端应用模式的智慧城管综合执法办案平台源码,案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析

城市管理综合执法管理平台实现执法办案、业务全流程在线办理&#xff0c;依托移动端PC端的“两端”应用模式&#xff0c;保障能够通过信息化手段进行日常的执法办案工作&#xff0c;强化执法监督功能。提供了案件在线办理、当事人信用管理、文书电子送达、沿街店铺分析等功能&a…

VMware vSphere Bitfusion 4.5.4 - 面向 AI 和 ML 应用提供弹性基础架构

VMware vSphere Bitfusion 4.5.4 - 面向 AI 和 ML 应用提供弹性基础架构 请访问原文链接&#xff1a;VMware vSphere Bitfusion 4.5.4 - 面向 AI 和 ML 应用提供弹性基础架构&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VM…

Apache HTTP server benchmarking tool(ab)-服务器基准测试工具一文上手

这是一个非常简单的工具&#xff0c;用途比较有限&#xff0c;只能针对单个URL进行尽可能快的压力测试。 ​ Windows下如何下载安装&#xff08;Linux安装十分简单&#xff09; Apache HTTP server benchmarking tool(ab)下载地址 ​ 资源 2.4版本 httpd-2.4.48-o111k-x64…

赋能AI未来,景联文科技推出高质量亿级教育题库、多轮对话以及心理大模型数据

当前&#xff0c;大模型正如雨后春笋般不断涌现&#xff0c;不断推动着大模型产业的应用实践进入加速发展的新阶段。 景联文科技是AI数据服务公司&#xff0c;提供海量优质大模型数据集&#xff0c;涵盖文本、图像、视频、音频等多类型数据&#xff0c;致力于为不同训练阶段的算…

maven:中央仓库验证方式改变:401 Content access is protected by token

前几天向maven中央仓库发布版本&#xff0c;执行上传命令mvn release:perform时报错了&#xff1a; [ERROR] Failed to execute goal org.sonatype.plugins:nexus-staging-maven-plugin:1.6.13:deploy (injected-nexus-deploy) on project xxxxx: Failed to deploy artifacts: …

基于Redis和openresty实现高并发缓存架构

目录 概述缓存架构设计实践代码路由业务封装redis 效果 概述 本文是对项目中 QPS 高并发相关问题的一种解决方案&#xff0c;利用 Nginx 与 Redis 的高并发、超低延迟响应&#xff0c;结合 Canal 进行实现。 openrestry官网 当程序需要提供较高的并发访问时&#xff0c;往往需…

【单片机】MSP430G2553单片机 Could not find MSP-FET430UIF on specified COM port 解决方案

文章目录 MSP430G2553开发板基础知识解决办法如何实施解决办法4步骤一步骤二步骤三 MSP430G2553开发板基础知识 MSP430G2553开发板如下图&#xff0c;上半部分就是UIF程序下载调试区域的硬件。个人觉得MSP430G2553开发板的这个部分没有做好硬件设计&#xff0c;导致很多系统兼…

计算机组成原理笔记-第1章 计算机系统概论

第一章 计算机系统概论 笔记PDF版本已上传至Github个人仓库&#xff1a;CourseNotes&#xff0c;欢迎fork和star&#xff0c;拥抱开源&#xff0c;一起完善。 该笔记是最初是没打算发网上的&#xff0c;所以很多地方都为了自我阅读方便&#xff0c;我理解了的地方就少有解释&a…

【鸿蒙】 模拟器运⾏

【鸿蒙】HUAWEI DevEco Studio安装-CSDN博客 【鸿蒙】创建第⼀个鸿蒙项⽬-CSDN博客 点击 Tools 菜单下的 Device Manager 点击 Install &#xff0c;安装模拟器 下载模拟器相关的SDK&#xff0c;点击 Finish 选择安装⽬录&#xff0c;点击 New Emulator 选择设备类型&#…

代码随想录——分发饼干(Leetcode455)

题目链接 贪心 class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(g);Arrays.sort(s);int count 0;for(int i 0, j 0; i < g.length && j < s.length; i, j){if(s[j] > g[i]){count;}else{i--;}}return count;} }

IDS使用规则

ids入侵检测系统 Snort(基于特征的入侵检测系统) 软硬件配套 snort官网链接&#xff1a;Snort - Network Intrusion Detection & Prevention System(https://www.snort.org) 环境&#xff1a;centos7,拖动需要开共享粘贴板和开双向 一、daq 1、预装dap所需程序 yum inst…

为什么五笔没人用了?

五笔输入法现在较少人使用的原因主要有以下几点&#xff1a; 学习门槛高&#xff1a;五笔输入法的学习难度相对较大&#xff0c;需要掌握所有的字根&#xff0c;全面了解编码的规律&#xff0c;并学习每个字的拆字原则&#xff0c;这要求用户有相当高的耐心和时间去学习和练习…

外星人Alienware m15R7 原厂Windows11系统

装后恢复到您开箱的体验界面&#xff0c;包括所有原机所有驱动AWCC、Mydell、office、mcafee等所有预装软件。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http://w…

【MySQL进阶之路 | 高级篇】InnoDB存储结构

1. 数据库的存储结构 : 页 索引结构给我们提供了高效的索引方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的.确切说是存储在页结构中.另一方面&#xff0c;索引是在存储引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入操作.不同的存…

Java | Leetcode Java题解之第165题比较版本号

题目&#xff1a; 题解&#xff1a; class Solution {public int compareVersion(String version1, String version2) {int n version1.length(), m version2.length();int i 0, j 0;while (i < n || j < m) {int x 0;for (; i < n && version1.charAt(…

速卖通测评成本低见效快,自养号测评的实操指南,快速积累销量和好评

对于初入速卖通的新卖家而言&#xff0c;销量和评价的积累显得尤为关键。由于新店铺往往难以获得平台活动的青睐&#xff0c;因此流量的获取成为了一大挑战。在这样的背景下&#xff0c;进行产品测评以积累正面的用户反馈和销售记录&#xff0c;成为了提升店铺信誉和吸引潜在顾…