当前位置: 首页 > article >正文

linux-shell脚本

  • shell的编码语法

shell脚本的第一行内容是: #!/bin/bash,这句话相当于是一个导包语句,将shell的执行环境引入进去了。

shell中变量的命名要求:
只能使用数字、字母和下划线,且不能以数字开头
变量赋值是通过"="进行赋值,在变量、等号和值之间不能出现空格!

有两种写法:$name(简化写法)、${name}

如果我们想在变量的结果后面直接无缝拼接其它字符串,那就只能使用带花括号的形式

变量分为四类

本地变量:本地变量就只在当前shell脚本中有效。
环境变量:临时环境变量(export VAR_NAME=VALUE),/etc/profile(永久生效)
位置变量:类似于java传参

执行结果

[root@bigdata01 shell]# sh location.sh abc xyz

location.sh
abc
xyz


特殊变量:$?、$#

$?:它表示是上一条命令的返回状态码,状态码在0~255之间

状态码 描述
0 命令成功结束
1 通用未知错误

127 没找到命令
128 无效退出参数
128+x Linux信号x的严重错误

130 命令通过Ctrl+C控制码越界

255 退出码越界

$#:它表示的是shell脚本所有参数的个数 

引号+变量的使用

首先是单引号 ' ' 单引号不解析变量

[root@bigdata01 shell]# name=jack
[root@bigdata01 shell]# echo '$name'
$name


然后再看一下双引号," ":双引号解析变量

[root@bigdata01 shell]# name=jack

[root@bigdata01 shell]# echo "$name"

jack 


反引号``

[root@bigdata01 shell]# name=jack

[root@bigdata01 shell]# echo `$name`

-bash: jack: command not found 


反引号是执行并引用命令的执行结果,在这里反引号是获取到了name变量的值,然后去执行这个值,结果发现没有找到这个命令。如果我们把name的值改为pwd,来看一下效果,这样就会执行pwd,并且把pwd执行的结果打印出来。

[root@bigdata01 shell]# name=pwd
[root@bigdata01 shell]# echo `$name`
/root/shell


反引号还有另一种写法,$()  效果一致

如果我想打印  'pwd',外面有个单引号

[root@bigdata01 shell]# echo "'$name'"
'pwd'

逻辑运算符:

for循环:

for((i=0;i<10;i++))
do
循环体...
done

 do也可以和for写在一行,只是需要加一个分号;

for((i=0;i<10;i++));do
循环体...
done

 for...in 写法

for i in 1 2 3
do
循环体...
done

while循环:

while 测试条件
do
循环体...
done

测试条件:整型:-gt(大于)、-lt(小于)、-ge(大于等于)、-le(小于等于)、-eq(等于)、-ne(不等于) 

#!/bin/bash
while test 2 -gt 1
do
echo yes
sleep 1
done

还有一种写法(个人比较喜欢)

#!/bin/bash
while [ 2 -gt 1 ]
do
echo yes
sleep 1
done 

#!/bin/bash
while [ "abc" = "abc" ]

do

echo yes

sleep 1

done 

if 分支语句: 

 #!/bin/bash
flag=$1
if [ $flag -eq 1 ]
then
echo one
fi

双分支

#!/bin/bash

#用户没有传入参数
if [ $# -lt 1 ]
then
 echo "not found param"

 exit 100

fi

#读取第一个参数
flag=$1
if [ $flag -eq 1 ]
then
 echo "one"
else
 echo "not support"

fi 

还可以类似于Java的else if

#!/bin/bash
if [ $# -lt 1 ]

   exit 100
fi


flag=$1
if [ $flag -eq 1 ]
then
 echo "one"
elif [ $flag -eq 2 ]

then

 echo "two"

elif [ $flag -eq 3 ]

then

 echo "three"

else

 echo "not support"

fi

  • shell 的执行

1、bash abc.sh

2、sh abc.sh

3、加上文件执行权限,chmod u+x abc.sh 

# 一个综合案例

nohup hello.sh >/dev/null 2>&1 &

# 解析

nohup和&:可以让程序一直在后台运行
/dev/null:是linux中的黑洞,任何数据扔进去都找不到了
>/dev/null:把标准输出重定向到黑洞中,表示脚本的输出信息不需要存储
2>&1 :表示是把标准错误输出重定向到标准输出中,标准输出可以使用文件描述符1来表示,标准错误输出可以使用文件描述符2来表示

  • shell 的调试 如:bash -x hello.sh

1、-x:启用调试模式。在此模式下,Bash 会逐行执行脚本,并打印出每一行命令及其执行结果。

2、假设脚本如下

#!/bin/bash
name="World"
echo "Hello, $name!"

3、执行结果,打印出每一行命令及其执行结果。

+ name=World
+ echo 'Hello, World!'
Hello, World! 


http://www.kler.cn/a/549790.html

相关文章:

  • 可观测性面试指南:常见问题与最佳实践
  • 【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。
  • Docker 常用命令基础详解(二)
  • 【经验记录】在windows电脑上使用Docker-Desktop部署searXNG搜索引擎
  • 利用亚马逊云科技RDS for SQL Server配置向量数据存储
  • 鸿蒙开发-自定义弹框用法
  • 【大模型系列】Windows系统上运行大语言模型方式
  • 【硬核对比】C语言 vs MATLAB:从内存管理到矩阵运算的降维打击
  • 【已解决】TypeError: AsyncConnectionPool.__init__(), new install bug, httpx==0.24.1
  • 【PYTORCH】官方的turoria实现中英文翻译
  • 电脑端调用摄像头拍照:从基础到实现
  • 力扣动态规划-32【算法学习day.126】
  • 第1章大型互联网公司的基础架构——1.1 单机房的内部架构
  • 领域驱动设计叕创新,平安保险申请DDD专利
  • 回顾Golang的Channel与Select第一篇
  • Docker-常见命令
  • android 源码切换分支
  • 升级 SpringBoot3 全项目讲解 — 别再使用 Optional 了,请使用 Jspecify 来替代它
  • 【Axure教程】数字滚动效果
  • boolen盲注与时间盲注,sqli-labs第八关与第九关