shell 脚本规范
shell脚本文件需要以.sh结尾
第一个原因,让别人认的这个是shell脚本,sh后缀编辑时有高亮显示。
拓展名后缀,如果省略.sh则不易判断该文件是否为shell脚本
# 执行脚本方式
1、 sh 脚本.sh
2、 bash 脚本.sh
3、 ./脚本.sh # 需要执行权限
4、 . 脚本.sh
5、 source 脚本.sh 子影响父
sh 和 source的区别:
sh:当使用sh来执行脚本时,它会创建一个新的子进程来执行脚本,并且脚本中的变量和环境设置通常不会影响当前的shell环境
source:使用source或.来执行脚本文件时,脚本中的命令会在当前Shell环境中执行,并且脚本可以修改当前Shell的变量和环境设置。
例
编辑脚本
#cat a.sh
#!/bin/bash
pwd
cd /opt
pwd
更换执行脚本方式执行显示如下
变量的类型
预定义变量
$$ 当前进程PID
$? 命令执行后的返回状态.0 为执行正确,非 0 为执行错误
$# 位置参数的数量
$* 所有位置参数的内容
$@ 所有的参数
$! 上一个后台进程的PID
自定义变量
定义:变量名称=值#注:
变量名称:只能由字母,数字,下划线组成,不能以数字开头;
注意:应该让变量名称有意义;
= 赋值符号 前后不能有空格 ;
值: 所有的字符串和数字都可以;
引用变量: $变量名 或 ${变量名}。例
环境变量
shell在开始执行时已经定义好的
env 查看所有环境变量
set 查看所有变量
环境变量拥有可继承性:export之后就拥有继承性
export 导出变量(作用范围)
永久生效
写到4个登陆脚本中 ~/.bashrc ~/profile 更好放在/etc/profile.d/* 下建立独立的环境变量配置文件
常用环境变量: USER(用户名)UID(用户uid)
HOME(家目录)
HOSTNAME(主机名)
PWD(所在目录)
PS1(命令提示符)
PATH(存储所有命令所在的路径)
位置变量
$1 $2 $3 $...例
编辑标本test.sh 加入位置变量$1 $2
执行显示如下
变量运算
算式运算符: +、-、*、/、()、%取余(取模)
运算方式: $(()) $[] expr
$(())
例:
$[]例:
expr例:
#注:运算符号两边的空格必须写
不能做浮点运算
乘法运算例:
或
浮点运算
bash本身不能做小数计算:需要bc命令转换 (yum安装)例:
#echo "2*4" | bc
#echo "2^4" | bc #2的4次方
#echo "scale=2;6/4" | bc #6除以4保留小数点后两位
scale: 精度结果如下
例2:
圆周率精确到1000位
#echo "scale=1000;4 * a(1)" | bc -l #注 -l定义使用的标准数学库结果如下
变量引用
转义:\
当一个字符被引用时,其特殊含义被禁止
把有意义的变的没意义,把没意义的变的有意义常用参数
\n换行\t table
例
#echo -e '5\n6\n7'
结果如下完全引用:'' //强引 硬引
部分引用:"" //弱引 软引
变量替换-匹配截取
# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配(贪婪匹配)
例: 设置变量 file=/dir1/dir2/dir3/my.file.txt
${file#*/}: 拿掉第一条 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}: 拿掉最后一条 / 及其左边的字符串:my.file.txt
${file#*.}: 拿掉第一个 . 及其左边的字符串:file.txt
${file##*.}: 拿掉最后一个 . 及其左边的字符串:txt
${file%/*}: 拿掉最后条 / 及其右边的字符串:/dir1/dir2/dir3
读取用户标准输入:read
read:功能就是读取键盘输入的值,并赋给变量
#参数注:
-s '后面的内容是加密信息,不要输出'-t 超时时间
例: 这里的藻头男是需要自己输入的,并且必须要在规定的五秒内输入才有效
变量嵌套(扩展)
eval 执行字符串内的可执行命令例:
#name=zaotounan
#zaotounan=帅哥
#eval echo '$'"${name}"结果如下
#注:先获取name的值,通过再次构造echo命令,使用eval再一次执行语句,就达到我们的目的。
扩展basename & dirname
basename 是去除目录后剩下的名字
# 不会检测文件系统,只是取路径的最后一段,将他截取出来
例:
#temp=/home/temp/1.test
#base=`basename $temp`
#echo $base
结果为下
dirname 是去除文件的目录名
# 不会检测文件系统,默认路径的最后一段为文件名,把它扇区
例:
#temp=/home/temp/1.test
#dir=`dirname $temp`
#echo $dir
结果为下
dirname 获取当前脚本的路径#可用于判断脚本的位置
$( cd $( dirname $0 ) ; pwd )例:编辑脚本b.sh
path=$( cd $( dirname $0 ) ; pwd ) #设置变量path[[ $path = '/opt' ]] && echo "继续执行" || echo "请在/opt目录下执行"
执行脚本结果如下
脚本运行
•sh –x script
这将执行该脚本并显示所有变量的值
•sh –n script
不执行脚本只是检查语法模式,将返回所有错误语法
•sh –v script
执行脚本前把脚本内容显示在屏幕上