文章目录
shell脚本基础和变量
1 shell脚本基础
1.1 shell脚本是什么
Shell(壳) 是一类程序的总称,用于将人类使用的高级语言转换成机器能看懂的二进制语言,为用户和内核之间的交互提供接口。
Shell脚本是一种用于编写和执行命令序列的扩建语言,或者是动态语言,只有在被调用时,才会执行。
-
脚:把保存在文本中代码执行起来
-
本:代码是保存在文本当中,特定条件(运行代码的条件)
Shell脚本可以通过文本文件的形式保存,并使用shell解释器来执行。
Shell脚本可以包含命令、条件判断、循环、函数等,可以使用变量、数组、字符串处理、文件操作等功能。
1.2 linux当中的shell分类
-
bash:主流,也是现在市面上绝大多数的linux系统默认的shell
-
sh:bash是sh的升级版
-
csh:类C语言的shell
-
tcsh:和csh类型,相当于升级版
-
nologin:也是一种shell,禁止用户登录
1.3 shell脚本的作用
-
自动化运维
-
批量化重复操作可以通过脚本和计划任务来自动运行
-
减轻管理人员的工作量
-
避免配置出错
1.4 shell脚本的结构
#!/bin/bash
#声明的脚本默认解释器,这个可以不加,默认就是bash
# this is my first shell-script
# 以"#"开头。表示当前的内容为注释内容,注释的内容是不会被运行的,写代码要养成写注释的习惯,
# 方便其他人阅读和理解
# 可执行语句:
# 所有的Linux可执行的命令都可以是代码的内容
cd /boot
echo "当前所在的目录:"
#在shell当中的作用相当于打印,echo要打印的内容都是字符串,推荐使用双引号。
pwd
echo "展示其中以vmL开头的文件:"
ls -lh vml*
1.5 shell脚本的执行方式
-
调试模式
脚本没有权限的情况下的运行模式。
bash:创建一个子shell,只在这个子环境当中运行,不会真正的执行代码,运行结束,子环境也会退出。 source:点命令,真正运行可执行的代码。
-
赋权执行
在工作中所有的脚本都是赋权执行的。
chmod +x 脚本文件 ./脚本文件
-
定时任务
- 使用绝对路径
- 需要执行权限
1.6 重定向
重定向:就是把这些信息保存到指定的文件当中去
重定向分类:
-
重定向输入:<
从指定的文件获取内容
-
重定向输出:
> :只能把标准输出保存到文件当中去,如果原文有内容会直接覆盖
>> :标准输出保存到文件当中去,不会覆盖原内容,而是在原内容之后追加
-
重定向错误输出
2> :将错误信息保存到指定的文件,文件当中的内容也会被覆盖。
2>> :将错误信息保存到指定的文件,文件当中的内容不会被覆盖而是在行后追加
-
混合输出:
&>
&>>
2 变量
变量:用来存放系统和用户需要使用的特定的参数
变量名:
- 自定义变量:由用户自己定义,修改和使用。
- 特殊变量:环境变量、只读变量、位置变量、预定义变量。
变量值:
- int:整数,没有小数点
- string:字符串,字母或者数字组成,会用引号引起来
- 布尔:true和false,为真还是为假(一般用于条件判断的返回值)
- 浮点:有小数点
2.1 自定义变量名
1、不要使用系统的命令作为变量名称
2、不要使用中文
3、变量名不能使用特殊符号来开头,可以使用下划线开头_
4、定义变量时,一定要是字母开头,不能以数字开头
5、变量名最好是名称对应的英文全称或者简写
read -p "提示信息" a
#read: 根据用户输入直接赋值给变量
#-p "":固定格式
#a:变量名
echo $a
强引用和弱引用(一般用于echo):
" ":弱引用,打印变量时,加上双引号就是变量的值
’ ':强引用,打印变量时,就是字符串的本身,不再代表变量对应的值
``:先运行指令,把指令运行的结果赋值给变量
2.2 变量的作用范围
2.2.1 全局变量
在全局配置文件 /etc/profile
当中修改,所有的用户都可以使用
export 变量名=值
如果有需要一直不变的参数可以供所有人使用,就可以配置全局变量
副作用:一旦有改动,增加了复杂性
2.2.2 环境变量
环境变量(全局变量的一种)是系统创建的,设置用户的工作环境,由系统维护,一般是不去修改的,让所有人都可以自动识别($PATH,自动补齐)
2.2.3 位置变量
脚本外传参
$1,$2,${10},${11}
2.2.4 预定义变量
预定义变量(是全局变量的一种,脚本解释器提供的,或者是编程语言自带的,不能修改)
-
$*:表示命令或者脚本需要处理的参数
-
$@:也表示命令或者脚本需要处理的参数,区别在于处理的方式不同
区别:" $* ",会把传入的参数当做一个整体来进行处理,不加双引号和$@是一样的,都是一个个处理;$@,加不加双引号,都会把参数一个个的处理
-
$#:记录传递给脚本参数的个数
-
$?:记录的上一次执行命令的返回码,用来判断上一次执行的命令是否成功
0和非0,只有0表示上一次的命令执行成功,其他的都是失败
2.3 运算方法
2.3.1 整数运算
a=12
b=5
c=$(($a%$b))
echo $c
i=$(expr 12 \* 5)
let d=12+10
echo $i
echo $d
(())
expr 12 + 5
expr 12 \* 7
i++ 都是表示自增1 i=i+1 先赋值再加 i=0 i=1+1 i+=2
++i 先加,再赋值 i=0 i=0+1
i-- 表示i自减1 i=i-1 i-=2
--i
2.3.2 非整数运算
#bash 默认不支持小数运算。bc
num=$(echo "4.4+5.5" | bc)
echo $num
#awk
num1=$(awk 'BEGIN{print 4.45*1.2}')
echo $num1