jck28 - 小柒 -bash编程

一,Bash编程基础

1.1 变量

1.1.1 变量定义规则

  • 变量名区分大小写,a和A为两个不同的变量。
  • 变量名可以使用大小写字母混编的形式进行编写。
  • 变量名与值之间的=两侧都不能有空格。
  • 在读取或打印变量时,需使用$+变量名。
  • 变量可以写在Bash脚本中的任何地方,在运行时,Bash会自动将其替换为变量值。

1.1.2 Bash 数据类型

  • 在 Bash 中声明变量后赋值,它会自动判断数据类型,不必在声明的同时去定义变量的数据类型。

1.1.3 变量类型

  • 系统定义的变量
    • 通常是以大写字母形式存在
    • 如 BASH、SHELL等
  • 用户定义的变量
    • 多数以小写字母参与命名
    • 但不具有大小写强制性规定

1.1.4 定义与使用

  • 语法: Variable_name=value
    • 定义变量名:letter_name=“abc”
    • 打印变量:echo $letter_name
    • 只读变量:a=“123” readonly a (只读变量不可修改,不可删除,关闭窗口后再打开变量不生效)
    • 删除变量:unset Variable_name
      image

1.1.5 字符串拼接

  • 基本语法: str3="${str1}${str2}
    image

1.2 引号

  • 输入的内容为简单的字符串或文本时,单引号和双引号的作用没有任何区别
  • 输出一个已定义的变量,则需要使用双引号

1.3 数组

  • 数组可以定义为相似类型元素的集合,在bash中数组不必是相似类型元素的集合
  • 基本语法:array_name=(value0 value1 value 2 value3)
    • 取数组:value = ${array_name[n]}
    • 单独赋值:array_name[0]=value0
    • 取出所有元素:${arr[@]} 或者 ${arr[*]}
    • 查看数组长度:${#arr[@]}
    • 输出索引:${!arr[@]}
      image

1.4 控制语句

1.4.1 if语句

  • 基本语法:if [ expression_1 ] && [ expression_2 ]; then statements fi
    • 需要注意空格,不然很容易写错
    • if [ $a -gt $b ]; then echo “大于”; elif [ $a -lt $b ]; then echo “小于”; elif [ $a -eq $b ]; then echo “等于”; fi
    • if [[ $a > $b ]]; then echo “大于”; elif [[ $a < $b ]]; then echo “小于”; elif [[ $a = $b ]]; then echo “等于”; fi

1.4.2 for循环

  • 基本语法:for variable in list do commands done
    image

1.4.3 while循环

  • 基本语法:while [ expression ]; do commands; multiple commands; done
    • 循环读取文件内容并输出
    • read命令:读取整行输入,每行末尾的换行符不被读入
      image

二,Bash脚本编写

2.1 read命令

  • read 命令是用于从终端或者文件中读取输入的内部命令

  • 格式 read <variable_name>

  • read 常用参数

    • -p 命令行选项在同一行上输入
    • -s 静默输入
    • -a 对数组进行多个输入
      *$REPLY 默认参数

    image

  • read支持算术运算

    运算符 描述 运算示例
    + 加法 $((7+2)) ,打印输出 9
    - 减法 $((7-2)) ,打印输出 5
    * 乘法 $((7*2)) ,打印输出 14
    / 除法 $((18/2)) ,打印输出 9
    ** 求幂 $((10**2)) ,打印输出 100
    % $((11%3)) ,打印输出 2
    += 常量递增变量,结果存储回变量 x=7;let”x += 7”;echo $x ,打印输出 9
    -= 常量递减变量,结果存储回变量 x=7;let”x -= 2”;echo $x ,打印输出 5
    *= 变量乘以常量,结果存储回变量 x=7;let”x *= 2”;echo $x ,打印输出 14
    /= 变量除以常量,结果存储回变量 x=18;let”x /= 2”;echo $x ,打印输出 9
    %= 变量除以常量的余数,结果存储回变量 x=11;let”x %= 3”;echo $x ,打印输出 2
  • 支持使用关系运算符

    运算符 描述 运算示例
    = 赋值 a=$b ,把变量b的值赋给a
    == 等于 [ $a == $b ] 相等则返回true
    != 不相等 [ $a != $b ]不等则返回true
  • 关系运算符列表

    运算符 描述 运算示例
    -eq 检查两个数字是否相等 1 -eq 1 ,返回 true
    -ne 检查两个数字是否不相等 1 -ne 2 ,返回 true
    -gt 检查左边数是否大于右边数 2 -gt 1 ,返回 true
    -lt 检查左边数是否小于右边数 1 -gt 2 ,返回 true
    -ge 检查左边数是否大于等于右边数 2 -ge 1 ,返回 true
    -le 检查左边数是否小于等于右边数 1 -le 2 ,返回 true
  • 算术运算符

  • 双括号

  • 反引号:反引号要与expr(通用表达式求值器)执行算术扩展。

  • let:let "Num3 = $(( Num1 + Num2 ))"

2.2 脚本创建

  • 新建一个test.sh文件
  • 编辑文件内容
#!/bin/bash
echo "Hello World"
  • Bash执行

    • chmod +x bash_script.sh (添加执行权限)
    • ./bash_script.sh (启动脚本)
  • 多行注释

    • 在<< BLOCK和BLOCK之间的内容会被当成注释
    • 在: ’’中的内容会被当成注释

2.3 算术运算

#! /bin/bash

a=10
b=20

if [[ $a = $b ]]; then echo "equal";
elif [[ $a > $b ]]; then echo "big";
elif [[ $a < $b ]]; then echo "samll";
fi

echo `expr $a + $b `
echo `expr $a - $b`
echo `expr $a \* $b`
echo `expr $a / $b`
echo `expr $a % $b`

image

2.4 文件参数传递

#! /bin/bash

echo $1,$2,$3
echo "文件名" $0
echo "参数数量" $#
echo "文件内容" $*
echo "return" $?

image

2.5 Bash 与目录操作命令结合

# 创建目录并生成文件
mkdir test
cd test
echo "hello" > test.txt
ls

2.6 Bash 与内存操作结合

#!/bin/bash

for i in `ps aux | awk '{print $6}'|grep -v 'RSS'`
do
 count=$[ $count+$i ]
done
echo "$count/kb"
~