Linux:shell脚本笔记

介绍

shell是直接基于操作系统的一门脚本语言,是用C语言编写的一个工具。
shell在工作中的作用:

1.批量的运行Linux命令

2.可以去运行大数据平台的工具以及数据库的脚本,实现脚本的动态传参

编写shell脚本

步骤一

使用vim + 文件名来新建一个shell脚本文件(...sh)

步骤二

在新文件的第一行要加上文件运行的命令来源:

#!/bin/sh

#!/bin/bash

步骤三

运行脚本 有三种基本方法

方法 说明
sh 文件名
bash 文件名
文件路径 前提是需要给文件赋予x的执行权限

语法基础操作

变量定义

1.shell脚本默认所有变量都是字符串,定义方法同python,变量值里有空格必须加引号,否则不用加

2.在定义变量的时候,不能随便添加空格,整个shell脚本对于空格的使用都是非常严格的

3.在读取变量的时候,要使用{变量名} 或者变量名 来对变量进行读取和引用。

输出语句

echo 要输出的内容

可选参数:-e:字符串里面的 \ 会被识别为转义字符

\n 换行符 \t 制表符 \c 连接符

输入语句

read -p "提示语句" 变量名字

给句子添加注释

在shell中如果多行注释,那么可能会因为一些符号导致注释出错或者失效,所以在shell中我们通常都是使用单行注释

在行首添加 # 即可

数据类型和基本操作方法

字符串

单引号和双引号的区别:单引号无法识别与解析字符串中的变量

基本操作方法

方法 说明
${#变量名}返回字符串长度
${变量名:start:len} 截取字符串
${变量名/old/new} 只替换匹配的第一个数据
${变量名//old/new} 替换所有数据

数字

整数运算

格式 说明
$[ ] echo \[n1-n2\]:变量前需要加用于识别
$() echo ((n1+$n2))
expr 属于Linux的命令,嵌套时注意加上反引号,例:echo expr $n1 + $n2
let 使用let语句实现数字计算,例:let c=n1+n2 echo $c;let语句不能直接用echo输出;特别的乘法符号前要加上转义符

小数运算

加法和减法

"变量+变量"|bc
乘法和除法

需要定义精度

"scale=小数精度;变量;+变量"|bc 这是个通用格式

数组

数组是很多不同的数据的一个集合体,中间使用空格来隔开数据

例: t=(100,22,3.4,hello) 默认都是字符串
数组的读取

${数组名} 只会读取数组的第一个元素
${数组名[*]} 读取数组的所有数据

注:数字的长度查询和元素内容的截取,和字符串的语法相同。

--在数组中查询指定序号的数据

${数组名[序号]}

--替换数据

数组名[seq]=value

--新增数据

数组名[数组长度]=value

逻辑部分

判断分支

if [ 条件判断 ]

then;

执行语句

elif [条件判断]

then;

执行语句

else

执行语句

fi
第二种形式

f test 条件判断

then

执行语句

elif test 条件判断

then

执行语句

else

执行语句

fi
数字的判断

逻辑 符号
大于 -gt
小于 -lt
大于等于 -ge
小于等于 -le
等于 -eq
不等于 -ne

字符串的判断

逻辑 符号
等于 ==
不等于 !=
并且 -a
或者 -o

循环控制

for循环

使用{}表示循环的范围,这种方法定义简单,但是不能用变量来进行括号内数据的替换。

bash 复制代码
for i in {1..10}				#开始..结束
do
  echo 变量是:$i
done

for i in {1..10..2}			#开始..结束..步长
do
  echo 变量是:$i
done

for i in {10..1}
do
  echo 变量是:$i
done

for i in {10..1..2}
do
  echo 变量是:$i
done

使用Linux的seq命令进行范围的表达:

bash 复制代码
for i in `seq 1 10`			#开始  结束
do
  echo 变量是:$i
done

for i in `seq 1 2 10`		#开始 步长 结束
do
  echo 变量是:$i
done

for i in `seq 10 -1 1` 	#从大到小,步长要写成负数
do
  echo 变量是:$i
done

min=1
max=10
for i in `seq $min $max`
do
  echo 变量是:$i
done

使用数组的内容进行循环

bash 复制代码
fruits=(apple orange banana)
for f in ${fruits[*]}
do
  echo 变量是:$f
done

使用其它系统命令进行循环

bash 复制代码
for i in `ls /opt`
do
  echo 文件名字是:$i
done

使用类C语言的方式进行循环

bash 复制代码
for ((i=1;i<=10;i++))
do
  echo 变量是:$i
done

for ((i=1;i<=10;i+=2))
do
  echo 变量是:$i
done

while循环

语法

whlie [循环条件]

do

执行语句

done
练习:

有一张纸的厚度是1毫米,珠穆朗玛峰高度是8848米,试问纸折几次厚度会超过山

bash 复制代码
#!/bin/bash
zhi=1
mount=8848000
count=0
while [ $zhi -lt $mount ]
do
 let zhi=zhi * 2
 let count++
done
echo "$count:$zhi"

函数

定义函数

语法

function 函数名(){

代码块

return 返回值

}

  • 不写参数,小括号是为了与其他语言匹配
  • 返回值不是必须的,shell的函数中,返回值只能返回 0-255 的数字,这个数字的返回一般是用来给调用者去判断函数的执行是否成功的。
  • 可以把linux的每一个命令,都当成系统定义好的函数来看待,例如 touch a.txt,touch本身是一个函数,a.txt是传递给函数的一个参数值。所以命令都有返回值,如果返回值是0,就表示操作成功,其他数字都是失败。
  • $? 是返回值
  • $* 是所有的参数
  • $# 是参数的数量
  • $数字 是指定位置的参数,$1 $2
  • 在文件里面,调用函数的时候,参数也可以写成 $ 的形式表示这里不定义参数,这里也是在接受参数,参数是在调用文件的时候,写在文件名字后面的。例如: sh t3.sh 1 2 3
相关推荐
qq_243050792 小时前
dnsmap:DNS枚举 详细完整教程 Kali Linux&Termux入门教程 黑客渗透测试 信息收集
linux·网络·安全·web安全·网络安全·系统安全·ddos
m0_748257184 小时前
海康威视摄像头RTSP使用nginx推流到服务器直播教程
运维·服务器·nginx
Pou光明5 小时前
1_linux系统网络性能如何优化——几种开源网络协议栈比较
linux·运维·网络·网络协议·开源
fen_fen5 小时前
Docker如何运行一个python脚本Hello World
运维·docker·容器
TianyaOAO6 小时前
inmp+discuz论坛
linux·运维·服务器
星光璀璨山河无恙6 小时前
【Linux】grep命令
大数据·linux
寒月6586 小时前
黑盒白盒测试
运维·服务器
海绵波波1076 小时前
zerotier实现内网穿透(访问内网服务器)
运维·服务器
helpme流水6 小时前
使用秘钥登录服务器
运维·服务器·github
ccino .6 小时前
【实现多网卡电脑的网络连接共享】
运维·服务器