Shell脚本基本语法大全_shell脚本语法

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以点击这里获取!


1.如何理解Shell脚本

Shell是命令解析器,用于解释用户对操作系统的操作。将用户的命令写入文件通过命令解释器进行操作就变成了Shell脚本。Shell的种类有很多种,包括sh、csh、tcsh、ash、bash。CetOS7默认采用的是bash,可以通过/etc/shells查看操作系统使用的shell的类型

2.如何一行执行多条命令

一般建议一条命令只做一件事情,为了组合多条命令,我们一般使用脚本文件来保存需要执行的命令。并且赋予文件可执行权限,赋予权限的命令如下:

chmod u+rx shellfilename

在Shell脚本的开头我们需要指定采用哪种命令解释器(注意要以#开头)

#!/bin/bash

Shell文件中一般一行对应一条命令我们可以通过分号组合多条命令

cd /home/ ; ls ; pwd

3.脚本的执行

执行Shell脚本有两种方法,一种方法会创建子进程执行shell命令,另一种会在当前进程执行shell脚本,影响当前环境。
方法一(创建子进程执行shell脚本,不影响当前环境)

bash ./filename.bash   #可以不用赋予可执行权限
./filename.sh

方法二(不创建子进程执行,影响当前环境)

source ./filename.sh
.  ./filename.sh

4.管道与重定向

管道和信号一样,是进程间通信的一种方式,匿名管道是Shell常用的通信方式之一用于将一个命令的执行结果传递给后面的命令。管道符号是"|"。

ps | cat #将ps的执行结果传递给cat
echo hello | ps #将echo的结果传递给 ps

如果执行的命令是两个外部命令的话,管道会创建两个子进程然后通过管道连接两个子进程。如果子进程中有内建的命令不会传递给父进程。

一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符。通过这三个文件描述符我们可以实现内容的输入和输出。
输入重定向符号"<" 
使用输入重定向符号可以将外部文件内容输入到变量

read var < /path/testfile
echo $var

输出重定向符号包括">"  “>>”  “2>” “&>”

会清空文件中的原有内容

echo 123 > /path/file

会向文件中追加对应的内容
2> 设置错误重定向,将错误信息输出到对应的文件
&> 输出所有内容到对应的文件(正常内容和错误内容)

wc -l < /etc/passwd #统计文件中的行数

可以将输入和输出重定向符号组合到一起使用

cat > /root/fileconfig/test.sh << EOF
echo "hello world"
EOF

5.变量的使用

变量的定义
格式: 变量名=变量值 等号两侧不能有空格

a=123

也可以使用let为变量赋值

let vara=10+20

也可以将命令赋值给变量

l=ls

将命令的执行结果赋值给变量,使用$()或者

letc=$(ls -l /etc)
letc=`ls -l /etc`

如果变量值中有空格等特殊字符可以包含在" "(双引号)或者 ’ ’ (单引号)中

变量的引用
通过${变量名}来对变量的值进行引用
echo ${变量名} 查看变量的值
变量名在部分场景下可以省略为 {变量名}在部分场景下可以省略为 变量名在部分场景下可以省略为变量名

变量的作用范围
默认变量的作用范围为当前终端,对父进程和子进程不生效。不过如果导出变量之后变量可以对子进程产生影响。子进程可以获得父进程的变量名称

export test_var

可以使用unset命令对变量取消赋值

unset test_var

系统环境变量
环境变量是每个Shell打开都可以获得的变量
set: 显示(设置)shell变量 包括的私有变量以及用户变量
不同类的shell有不同的私有变量 bash,ksh,csh每中shell私有变量都不一样。
env:显示(设置)用户变量
export:显示(设置)当前导出成用户变量的shell变量
除了上面的这些命令之外Shell中还有一些特殊的变量

$?  #用来判断上一条命令是否正确执行
$$  显示当前进程的PID
$0 获得当前进程的名称
$PATH 当前的环境变量
$PS1  用来定义命令行提示符的环境变量

向环境变量中追加环境变量

PATH=$PATH:/root #追加环境变量

所有的环境变量都export过,对子终端生效对新终端不生效

export PATH=:$PATH:/root/

环境变量的配置文件

#系统和终端使用的环境变量
/etc/profile
/etc/profile.d/
/etc/bashrc
#用户使用的环境量
~/.bash_profile
~/.bashrc

使用不同的方式切换用户,会获得不同的环境变量

su username (nologin shell)
#会使用下面文件中的环境变量
.bashrc
/etc/bashrc

su - username(login shell)
#会使用所有文件中的环境变量
/etc/profile
.bash_profile
.bashrc
/etc/bashrc

环境变量配置之后不会立即生效,可以通过下面的命令使其生效

source /etc/bashrc 使其生效

如果觉得命令太长可以给各个命令指定一个别名

alias rm = 'rm -i'

位置变量
$1 $2…用来表示传入脚本或者函数的位置参数
$0 在脚本中执行用来表示脚本的路径
在读取环位置变量的时候如果位置变量不存在则为空,如果不想显示为空可以给变量指定一个默认的值,在变量不存在的时候使用默认的值。

${2-999}  #第二个参数如果不存在的时候则用999替换对应的变量值

6.数组的使用

定义数组的时候通过小括号指定数组类型,数组元素之间通过空格划分

ARRAY=( 10.0.0.1  10.0.0.2  10.0.0.3 )

显示数组的所有元素

echo  ${ARRAY[@]}

显示数组元素的个数

echo ${#ARRAY[@]}

显示数组的第n元素  编号是从0开始的

echo ${ARRAY[n]}

7.转义和引用

需要注意的Shell脚本中的一些特殊符号

# 用来进行注释
; 用来连接两个命令或者脚本
\ 用来对一些符号进行转义
" 和 ' 用来引用一些字符串

通过\来对一些符号进行转义

\n \r \t 对单个字母进行转义
\$ \" \\ 对单个非字母进行转义

常用的引用符号

"  双引号
' 单引号
` 反引号
'$var'  变量不会解释
"$var"  变量会解释

8.运算符

赋值运算
=赋值运算符,用于算术赋值和字符串赋值
使用unset 取消变量赋值
=除了作为赋值运算符还可以作为测试操作符

算术运算符

  • -  *  /  **  %(加 减 乘 除 乘方 取余)
    使用expr进行运算,但目前只支持整数运算
expr  4 + 5
num2=`expr 4 + 5`

数字常量
使用下面的格式定义数字常量

let "变量名=变量值"
变量值使用0开头为八进制
变量值使用0x开头为十六进制

双圆括号是let命令的简化

((a=10))
((a++))
echo ((10+20))

9.各种特殊符号

引号

' 完全引用 不解释变量
" 非完全引用变量解释
` 反引号 用于执行命令

圆括号()  (())  $()

单独使用圆括号会产生一个子shell  
(xyz=123)

数组初始化使用圆括号 
IPS=(ip1 ip2 ip3)

算数运算用到圆括号
echo $(( 19 + 20 ))

命令的结果传给变量 
cmd=$(ls) 

[]   [[]]方括号做测试
单独使用方括号是测试(test)或数组元素功能
两个两个方括号表示测试表达式

<>尖括号,重定向符号

{}花括号

指定输出输出范围 echo {0..9}
文件复制 cp -v /etc/passwd{,.bak}
等价于cp -v /etc/passwd  /etc/passwd.bak

运算和逻辑符号

<  = 比较运算符
&& || !  逻辑运算符(与或非)

其他符号

case 语句的分隔符要转义;;
:   空指令
.   和source命令相同
~   家目录
,   分割目录
*   通配符  
?   条件测试或通配符
$   取值符号
|   管道符号
&   后台运行
_   空格
cd - 返回上一次操作的目录

10.测试与判断

退出命令和退出状态
exit命令用来退出执行的脚本
exit 10 返回10给shell 返回为0位不正常退出
$?  判断当前shell前一个进程是否正常退出测试命令test
test命令用于检查文件或比较值
test可以做以下测试:
文件测试
数字比较测试
字符串测试
test测试语句可以简化为[]符号
[]符号还有扩展写法[[]]支持&& 、 || 、<、>等逻辑判断

man test  查询test命令的用法

测试文件\字符串\整型数字
test -f /etc/passwd  如果文件存在且为普通文件则为真
if test -e ./bash
then
    echo '文件已存在!'
else
    echo '文件不存在!'
fi
echo $?(0存在 1不存在)
---------------------------------------
[ -d  /etc/ ]#判断目录是否存在
---------------------------------------
//比较大小
-eq    等于则为真
-ne    不等于则为真
-gt    大于则为真
-ge    大于等于则为真
-lt    小于则为真
-le    小于等于则为真
[ 5 -gt 4]  #5大于4
---------------------------------------
#[[]] 支持各种特殊的逻辑符号
[[ 5 > 4 ]]
---------------------------------------
#判断字符串是否相等
[ "abc" = "abc" ] 

使用if命令进行各种逻辑判断
使用if-then语句

if[测试条件成立] 或命令返回值是否为0
then 执行相应命令
fi结束

if pwd 
then 
    echo "pwd running"
fi    

使用if-then-else语句

if [ 测试条件成立 ]
then 执行相应命令
else 测试条件不成,执行命令
fi结束

if [ 测试条件成立 ]
then 执行相应命令
elif [ 测试条件成立 ]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi结束

嵌套if语句

if [ 测试条件成立 ]
then 执行相应命令
    if [ 测试条件成立 ]
    then 执行相应命令
    fi
 fi结束   

11.分支语句

case语句和select语句可以构成分支,这个和C语言中的swich-case语法一样

case "$变量" in
   "情况1" )
    命令... ;;
    "情况2" )
    命令... ;;
     * )
     命令... ;;
 esac    
 
 case "$1" in
    "start"|"START")
    echo $0 start...
    ;;
    "stop")
    echo $0 stop...
    ;;
    )
    echo "others"
esac    

12.循环

for循环语句;使用for循环遍历命令的执行结果

for循环的语法

for 参数  in 列表
    do 执行的命令
done 封闭一个循环

使用反引号或$()方式执行命令,命令的结果当做列表进行处理

for i in {1..9} 
do echo hello 
echo $i 
done
for filename in `ls *.mps`
do echo ${filename}
mv $filename $(basename $filename .mp3).mp4
done

列表中包含多个变量,变量用空格分割
对文本的处理,要使用文本查看命令取出文本内容
默认逐行处理,如果文本出现空格会当做多行处理
    
C语言风格的for命令

for((变量初始化;循环判断条件;变量变化))
do
   循环执行的命令
done

for (( i=1 ; i<=10 ; i++))
do
   echo $i
 done  

while循环

while test测试条件是否成立
do
  命令
done

while [ $a -lt 10]
do
  ((a++))
  echo $a
done    

while: #死循环
do
    echo always
done

#until循环与while循环相反,循环测试为假时,执行循环,为真时循环停止
until [ 5 -lt 4]
do
  echo hello
done       

break和continue语句

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以点击这里获取!

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值