一、Bash编程基础
1.1 变量
1.1.1 语法
Variable_name=value
1.1.2 变量定义的规则
- 变量名区分大小写,a和A为两个不同的变量;
- 变量名可以使用大小写字母混编的形式进行编写;
- 变量名与值之间的=两侧都不能有空格;
- 在读取或打印变量时,需使用$+变量名;
- 变量可以写在Bash脚本中的任何地方,在运行时,Bash会自动将其替换成变量值。
1.1.3 Bash数据类型
- 在Bash中声明变量后赋值,它会自动判断数据类型,不必在声明的同时去定义变量的数据类型。
1.1.4 Bash变量的类型
-
系统定义的变量:
- 通常是以大写字母形式存在,如BASH、SHELL等。
-
用户定义的变量:
- 多数以小写字母参与命名,但不具有大小写强制性规定。
1.1.5 Bash变量的定义与使用
letter_name="abc"
echo $letter_name
1.1.6 只读变量
a="123"
readonly a
1.1.7 删除变量
unset Variable_name
1.1.8 字符串的拼接
基本语法:str3="${str1}${str2}"
1.2 引号
-
输入的内容为简单的字符串,或者文本时,单引号和双引号的作用没有任何区别。
-
输出一个已定义的变量,则需要使用双引号。
1.3 数组
- 数组可以定义为相似类型元素的集合。
- 在Bash中,数组不必是相似类型元素的集合。
1.3.1 索引数组的声明和赋值
declare -a Array_Name # 索引数组
Array_Name[index_1]=value_1
Array_Name[index_2]=value_2
或
Array_Name=(
[index_1]=value_1
[index_2]=value_2
)
1.3.2 数组的访问
declare -a arr1=( hello world )
declare -A arr2=( [key1]=hello [key2]=world )
echo ${arr1[0]}
echo ${arr2[key1]}
1.3.3 取出所有元素
declare -a arr=( hello world )
echo ${arr[@]}
echo ${arr[*]}
1.3.4 数组的长度
declare -a arr=( hello world )
echo "arr length is ${#arr[@]}"
# 需要看总长度的时候使用@ 如果是当个元素长度则使用索引/key
1.3.5 向数组中添加元素
declare -a arr=( hello world )
arr+=(hogwarts)
arr[5]=harry
1.3.6 输出索引
declare -a arr=( hello world )
arr+=(hogwarts)
arr[5]=harry
echo "arr indexs is ${!arr[@]}"
1.4 控制语句
1.4.1 if 循环
# 单条件
if [ expression ];
then
statements
fi
# 多条件与
if [ expression_1 ] && [ expression_2 ];
then
statements
fi
# 多条件或
if [ expression_1 ] || [ expression_2 ];
then
statements
fi
# 多分支
if [ expression_1 ] ;
then
statements
elif [ expression_2 ] ;
then
statements
else
statements
fi
1.4.2 for 循环
for variable in list
do
commands
done
//或
for (( expression1; expression2; expression3 ))
do
commands
done
for循环范围:
for num in {10..0..1}
do
echo $num
done
for循环数组:
arr=( "Welcome" "to" "hogwarts" )
for i in "${arr[@]}"
do
echo $i
done
# @ 与 * 的区别
for i in ${arr[@]}
do
echo $i
done
for i in ${arr[*]}
do
echo $i
done
for i in "${arr[*]}"
do
echo $i
done
表达式for循环:
for ((i=1; i<=10; i++))
do
echo "$i"
done
1.4.3 while 循环
while [ expression ];
do
commands;
multiple commands;
done
1.4.4 break 与 continue
- break语句可以终止for循环的重复性任务。
- continue语句在for循环中,以特定条件,跳过该条件下给定的特定语句。
1.5 函数
function_name() {
commands
}
1.5.1 变量的作用域
- 默认情况下,所有变量都定义为全局变量,即使在函数内部声明,也是如此;
- local关键字在函数内部声明局部变量,该变量只能够在该函数内部使用。
1.5.2 返回值
-
Bash函数中,其返回值是执行的最后一个语句的状态。1-255(十进制)范围内表示失败,除此之外表示成功。
-
想要从函数中返回任意实际的值,最简单的选择是将函数的执行结果分配给一个全局变量。
-
更好的选择,是将值发送到stdout再打印输出。
1.5.3 参数传递
- $0为函数本身;
- $1、2…n参数传递的顺序位;
- $#保存传递给函数的位置参数或数量;
- $$当前进程ID号;
- $*或$@保存传递给参数的所有位置参数或参数;
- $?显示最后一个命令的退出状态,0表示正常,其他表示错误退出。
二、Bash脚本编写
2.1 Bash脚本创建
touch bash_script.sh
-
vim
或者vi bash_script.sh
- 写入代码
#!/bin/bash
echo "Hello Bash"
### 2.2 Bash执行
- `chmod +x bash_script.sh`
- `./bash_script.sh`
2.3 Bash注释
-
单行注释:
- 注释段落的开头使用
#
。
- 注释段落的开头使用
-
多行注释:
- 在
<<BLOCK
和BLOCK
之间的内容会被当成注释; - 在
:"
中的内容会被当成注释。
- 在
2.4 read命令
-
read命令是用于从终端或者文件中,读取输入的内部命令;
-
格式:
read <variable_name>
; -
read常用参数:
-
-p
命令行选项在同一行输入; -
-s
静默输入; -
-a
对数组进行多个输入。
-
2.4.1 read读取单个或多个变量
echo "Enter the your name: "
read user_name
echo "Your name is $user_name"
echo
echo "Enter your age, phone and address: "
read age phone address
echo "your age is:$age, phone is:$phone, address: $address "
2.5 算术运算
- Bash支持11种算术运算符。
运算符 | 描述 | 运算示例 |
---|---|---|
+ | 加法 | $((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 |
2.5.1 关系运算符
运算符 | 描述 | 运算示例 |
---|---|---|
= | 赋值 | a=$b ,把变量b的值赋给a |
== | 等于 | [ $a == $b ] 相等则返回true |
!= | 不相等 | [ $a != $b ]不等则返回true |
2.5.2 关系运算符列表
运算符 | 描述 | 运算示例 |
---|---|---|
-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 |
2.5.3 Bash算术运算符
- 双括号
- 反引号:反引号要与expr(通用表达式求值器)执行算术扩展。
- let:
let "Num3=$((Num1+Num2))"
2.6 脚本输出文件
touch test.sh
chmod +x test.sh
vim test.sh
#!/bin/bash
echo "Hello Bash" > test.txt
2.7 Bash与目录操作命令结合
# 创建目录并生成文件
mkdir test
cd test
echo "hello" > test.txt
ls
2.8 Bash与内存操作结合
#!/bin/bash
for i in `ps aux | awk '{print $6}'|grep -v 'RSS'`
do
count=$[ $count+$i ]
done
echo "$count/kb"
2.9 脚本中编写函数
- 脚本中编写了函数,需要在脚本中调用才会执行;
- 函数如果涉及传参,需要在调用函数时带上参数。