shell编程二

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
更换执行脚本方式执行显示如下

shell编程二_第1张图片

变量的类型

预定义变量
                            $$ 当前进程PID
                            $? 命令执行后的返回状态.0 为执行正确,非 0 为执行错误
                            $# 位置参数的数量
                            $* 所有位置参数的内容
                            $@ 所有的参数
                            $! 上一个后台进程的PID
​自定义变量
                        定义:变量名称=值
#注:
         变量名称:只能由字母,数字,下划线组成,不能以数字开头;
         注意:应该让变量名称有意义;
         = 赋值符号 前后不能有空格 ;
         值: 所有的字符串和数字都可以;
         引用变量: $变量名 或 ${变量名}。

shell编程二_第2张图片

​环境变量
                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 

shell编程二_第3张图片

执行显示如下

变量运算

算式运算符: +、-、*、/、()、%取余(取模)  

运算方式:   $(())      $[]      expr

        $(())
例:      

         $[]
例:        
         expr
例:
#注:运算符号两边的空格必须写
        不能做浮点运算

乘法运算
例:
浮点运算
bash本身不能做小数计算:需要bc命令转换 (yum安装)
例:
                   #echo "2*4" | bc
                   #echo "2^4" | bc                  #2的4次方
                   #echo "scale=2;6/4" | bc     #6除以4保留小数点后两位
                   scale: 精度
结果如下shell编程二_第4张图片
例2:
圆周率精确到1000位
#echo "scale=1000;4 * a(1)" | bc -l     #注 -l定义使用的标准数学库
结果如下

shell编程二_第5张图片

变量引用

转义:\
           当一个字符被引用时,其特殊含义被禁止
           把有意义的变的没意义,把没意义的变的有意义
常用参数
           \n换行
           \t table

 #echo -e '5\n6\n7'
结果如下 
shell编程二_第6张图片完全引用:''   //强引 硬引
部分引用:"" //弱引 软引

变量替换-匹配截取

# 是去掉左边(在键盘上 # 在 $ 之左边)
% 是去掉右边(在键盘上 % 在 $ 之右边)
单一符号是最小匹配;两个符号是最大匹配(贪婪匹配)
例: 设置变量 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
结果为下
shell编程二_第7张图片

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
                执行脚本前把脚本内容显示在屏幕上

shell编程二_第8张图片

感谢观看!希望能够帮助到大家!

你可能感兴趣的:(linux,运维,服务器,运维开发,java,c语言)