bashshell 的一些基本知识

bash编程权威指南1

前言:bash脚本语言是一种解释型的语言,什么是解释型语言呢?程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次。因此效率比较低。bash脚本语言需要运行在shell平台上,就像Python代码需要运行在pyenv虚拟环境中运行,js在浏览器的js引擎中运行,在node.js的平台上运行一样

  • bash脚本语言文件格式
第一行#!/bin/bash :定义bash脚本解释器
注释信息:#
代码注释:
缩进,适度添加空白行
  • bash中的变量介绍
局部变量
本地变量
环境变量
位置参数变量
特殊变量
  • 变量的类型
1:字符类型
2:数值类型 
    精确类型
    近似类型
3:弱类型:字符型
  • bash中支持的运算符以及变量赋值的表达时候
+ , - , * , / , % , ** 

1let var=$var1+$var2

2var=$[expression]:这里虽然expression是字符表达式,但是通过 $[ ]之后就变成了算数运算, 例如:var=$[ 1+2 ]

3var=$(命令)  这里是将命令输出的结果赋值var变量

4:注意:乘法有些时候需要转义

5let i=$i+1 等价于 let i+=# 等价于 let i++
   let i=$i-1 等价于 let i-=# 等价于 let i--
  • 入门小测试
  • 1 .计算/etc/passwd文件中的第10个用户和第20个用户的id号之和
idn10=$(sed -n 10p /etc/passwd|cut -d: -f3)
idn20=$(sed -n 20p /etc/passwd|cut -d: -f3)
let idn=$idn10+$idn20
  • 2 .计算/etc/rc.d/init.d/functinos和/etc/inittab文件的空白行数之和
    注意:这里在写正则表达式的时候,要搞清楚空白行和以空白字符开头的行的正则表达式写法不一样
    空白行:egrep "^[[:space:]]*$" yhy
    以空白字符开头的行:egrep "^[[:space:]]+" yhy
idn1=$(egrep "^[[:space:]]*$"/etc/rc.d/init.d/functinos)
idn2=$(egrep "^[[:space:]]*$" /etc/inittab)
let idn=$idn1+$idn2

(五)bash编程权威指南2

前言:条件测试语法有两种书写模式,一种是[ expression ], 另一种是[[ expression ]],为了在书写条件测试的过程中,不让大家将两种格式相互混淆,那么在这里我只讲一种格式,也就是第一种格式[ ]。因为第一种格式在书写过程中基本不会写错,而第二种格式经常会写错,且第一种格式在很多服务的启动脚本中经常看到,因此应用广。那么为了降低bash编程的门槛,在这里我只讲解第一种,如果对shell编程感兴趣的同学,可以查看《shell脚本编程大全》一书
判断某需求是否满足,需要由测试机制来实现,下面我们就讲讲如何编写测试表达式来实现所需的测试

  • 条件测试的状态返回值和书写格式
1:执行命令,利用状态返回值来判断
    0:成功
    1-255:失败

2:测试表达式
    test expression
    [ expression ]  常用
    [[ expression ]]
  • bash的测试类型
数值测试
字符串测试
文件测试
  • 数值测试:数值比较
-eq:是否等于 [ $num1 -eq $num2 ]
-ne:是否不等于 [ $num1 -ne $num2 ]
-gt:是否大于 [ $num1 -gt $num2 ]
-ge:是否大于等于 [ $num1 -ge $num2 ]
-lt:是否小于 [ $num1 -lt $num2 ]
-le:是否小于等于 [ $num1 -le $num2 ]
  • 字符串测试:字符比较
==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左侧字符串是否能够被右侧的pattern所匹配
-z“string”:判断指定的字符串是否为空 ,空则为真,不空则假
-n“string”:判断指定的字符串是否为不空 ,不空则为真,不空则假
注意:
(1)字符串要加引号
(2)在做字符串的比较的时候,格式如下: 
if [ "$VARIABLE" == "$VARIABLE" -a "$VARIABLE" == "cpu" ];then 需要在运算符号两边有空格,并且使用双引号将字符串包裹起来,这样即使是变量也可以替换
  • 文件测试
存在性测试
    -a file
    -e file 
    文件的存在性测试,存在为真,否则为假

文件类型测试 
    -b file:是否存在并且为块设备文件
    -c file:是否存在并且为字符设备文件
    -d file:是否存在并且为目录文件
    -f file:是否存在并且为普通文件
    -h/l file:是否存在并且为符号链接文件
    -p file:是否存在并且为管道文件
    -S file:是否存在并且为套接字文件

文件权限测试 
    -r file:是否存在并且为当前用户可读
    -w file:是否存在并且为当前用户可写
    -x file:是否存在并且为当前用户可执行

特殊权限测试 
    -u file:是否存在并且为拥有SUID权限
    -g file:是否存在并且为拥有GUID权限
    -k file:是否存在并且为拥有Sticky权限

文件是否有内容 
    -s file:是否存在并且有内容

变量是否有为空,为空则为真 
    -z ""$VARIABLE"

文件的时间戳测试 
    -N file:文件自从上次被读取后是否修改过

从属关系测试 
    -O file:当前用户是否为文件的属主
    -G file:当前用户是否属于文件的属组

双目测试 
    file1 -ef file2:是否为同一文件系统上的指向同一iNode的硬链接
    file1 -nt file2:file1 是否新于file2
    file1 -ot file2:file1 是否旧于file2
  • 组合条件测试
逻辑运算
第一种方式 
    COMMAND1 && COMMAND2
    COMMAND1 | | COMMAND2
    ! COMMAND
    [-O file]&&[-r file]

第二种方式 
    [ expression -a expression ]:与运算
    [ expression -o expression ]:或运算
    ! expression
    例如:[ -O file -a -x file ]
  • 脚本的状态返回值
1:默认是脚本执行的最后一条命令的返回值
2:自定义状态退出状态码 
    exit [n]:n为自己指定的状态码 
    注意:shell进程遇到exit时候,会立即终止,整个脚本执行结束
  • 条件测试小练习
  • 将当前主机名称保存至hostName变量中,主机名如果为空,或者为localhost,将其设置为uplooking.com
hostName=$(hostname)
[ -z "$hostName" -o "$hostName"=="localhost.domain" -o "$hostName"=="localhost" ]&&hostname uplooking.com
  • 向脚本传递参数
位置参数变量
    ls /etc/init.d/network:其中/etc/init.d/network为位置参数
    myscript.sh argu1 argu2 
在脚本文件中的引用方式: 
    $1 , $2 ...: 表示给脚本传递的第一个参数和第二个位置参数
    到了两位数的时候用 ${10} , ${11},因为$11会产生歧义。
轮替 
    shift [n] :位置参数轮替
  • 位置参数小练习
  • 写一个脚本,通过命令行传递两个文本文件路径名给脚本,计算两个文件的空白行之和
!#/bin/bash
# description
file_line1=$(egrep "^[[:space:]]*?" $1|wc -l)
file_line2=$(egrep "^[[:space:]]*?" $2|wc -l)
echo "the total lines of this two files is $[ $file_line1+$file_line2 ]"
  • 特殊变量
$0:脚本文件路径名称本身
$#:保存了脚本参数的个数
$*:所有参数
$@:所有参数
  • 过程式编程语言的代码执行顺序
顺序执行:逐条运行
选择执行: 
    代码存在一个或多个分支,只执行其中一个
    代码有一个分支:条件满足时才会执行
    两个或以上的分支:只会执行其中一个满足条件的分支
循环执行: 
    代码片段(循环体)要执行01或多个来回
选择执行: 
    单分支的if语句
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值