shell scripts

1、shell scripts的执行
shell scripts文件一般以.sh做后缀
(1)几种执行脚本的方式
①通过路径执行指令,脚本文件需要具有可执行权限
  • 绝对路径:/xxx/xxx/aa.sh
  • 相对路径:cd到脚本所在目录,通过./aa.sh执行
  • PATH:将aa.sh的路径放入PATH变量中,直接执行aa.sh
②以bash程序来执行,脚本文件只要具有可读权限就行
使用bash aa.sh或sh aa.sh执行
(2)shell脚本的构成
  • 开头必须以”#!/bin/bash“开始,代表该脚本要以什么shell来执行,其后的#都是注释
  • 脚本结束之后加上一个“exit 数字”定义返回值,0-执行成功,其他数字-返回失败错误码

插曲:date用法
①显示时间
date -d “时间描述” +“时间格式”
②设置时间 只有root有权限
date -s “时间”
③时间描述:
  • N day ago
  • +/-N year/month/day/min/seconds
④时间格式
%Y-%m-%d %H:%M:%S
eg:date -d "20161125" +%s 显示的是从从1970年1月1日00:00:00到目前经历的秒数

(3)脚本执行方式差异
①前面介绍的通过路径和bash来执行脚本的方式都是需要新建一个bash环境来执行脚本内的指令,也就是上面的脚本执行方式都是在子程序的bash环境中执行的,子程序结束时,子程序内变量的生命周期也结束了,所以父程序是访问不到子程序的变量的。
②使用source/. xxx.sh来执行脚本
source或点(.)运行脚本是在当前的父bash中运行脚本的,所以脚本中的变量可以保留在父bash中。这就是为什么修改~/.bashrc中的配置需要使用source而不是bash才能生效的原因了。

2、shell scripts语法
2.1、$((运算内容)) 使用这种方式可以对数字进行加减乘除

2.2、使用test指令的测试功能
(1)测试文件属性
test -【defbc】 文件
-d 判断文件是否是一个目录
-e 判断文件/目录是否存在
-f 判断文件是否是一个普通文件
-b 判断文件是否是一个块文件
-c 判断文件是否是一个字符设备文件
(2)测试文件权限
test -【rwx】 文件 判断文件是否具有读/写/执行的权限
(3)比较2个文件
test 文件1 -nt 文件2 判断文件1是否比文件2新(newer than)
test 文件1 -ot 文件2 判断文件1是否比文件2旧(older than)
test 文件1 -ef 文件2 判断文件1和文件2是否是同一个文件的2个硬连接
(4)判断2个整数大小
test 数字1 选项 数字2
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
(5)判断字符串
test 选项 字符串
-n 字符串的长度非0返回true
-z 字符串的长度为0返回true
test 字符串1=/!=字符串2 判断2个字符串是否相等
(6)组合判断
-a 相等于&&
-o 相当于||
! 取反,相当于非

2.3、利用判断符号[]
[]与test的用法基本相同,[]使用有以下注意事项:
  • []内每一个选项或参数之间都要有个空格,并且距离[]的两边也要有空格。
  • 使用变量时必须要用双引号引起来。
[]常用在if..then...fi的语法中

2.4、shell scripts的默认参数
(1)shell脚本执行时也可以用参数来控制执行的结果,这些参数跟在shell脚本的后面。
$0 表示脚本名
$N 表示脚本后面接的参数,N从1开始
$# 表示参数个数
$@ 表示全部的参数,每个参数是独立的
$* 也表示全部参数,但是每个参数默认是用空格隔开的
(2)shift N
从最前面消除参数,不加数字默认消除一个。

2.5、条件判断式
(1)if...then语法
if [中括号条件判断式] ; then
要执行的命令
fi
注:
  • fi 即将if反过来写,表示结束if之意
  • [] 可以写多个[]条件判断式,之间根据需要用&&或||分隔开
  • if后面一定要有空格,分号前后有没有都行
(2)多重、复杂条件判断式语法
①if [中括号条件判断式] ; then
要执行的命令
else
要执行的命令
fi
②if [中括号条件判断式] ; then
要执行的命令
elif [中括号条件判断式] ; then
要执行的命令
else
要执行的命令
fi

插曲:netstat查看网络端口服务
netstat -tuln
-a 列出所有端口
-t 显示TCP相关
-u 显示UDP相关
-l 显示监听端口
-n 直接使用IP地址,不使用DNS
-pt 显示PID和进程名
-c 每隔一秒输出网络信息

(3)使用case...esac判断
语法如下:
case 变量 in
“变量内容1”)
程序段1
;;
“变量内容2“)
程序段2
;;
*)
程序段
;;
esac

2.6、使用函数function功能
(1)语法:
function 函数名(){
程序段
}
function和shell scripts一样,也拥有内建变量$0,$1,。。。
此外,函数的定义必须在函数的调用之前,因为脚本的执行是由上至下,从左到右的。
(2)函数使用
函数名 参数1 [参数2.。。]

2.7、循环
(1)当型循环
while [ 条件表达式 ]
do
程序段
done
(2)固定循环
①写法一:
for var in var1,var2.../变量
do
程序段
done
②写法二:
for((初始值;判断条件;值变化))
do
程序段
done
其中值的变化可以写成“变量++”或“变量=变量+1”的形式
(3)其他
①shell中变量自增的方式 ((变量++))
②定义连续变量要借助seq命令,例如1~100 $(seq 1 100)

2.8、shell脚本的调试
bash -nvx 脚本
-n 不执行脚本,仅检查预发问题
-v 在执行脚本前,将脚本输出到屏幕
-x 显示执行过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值