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:功能就是读取键盘输入的值,并赋给变量
#参数注:
-s '后面的内容是加密信息,不要输出'-t 超时时间
例: 这里的藻头男是需要自己输入的,并且必须要在规定的五秒内输入才有效
?
变量嵌套(扩展)
eval 执行字符串内的可执行命令例:
#name=zaotounan
#zaotounan=帅哥
#eval echo '$'"${name}"结果如下
#注:先获取name的值,通过再次构造echo命令,使用eval再一次执行语句,就达到我们的目的。
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
??????????????? 执行脚本前把脚本内容显示在屏幕上