介绍
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