1. 变量
1.1 类型
-
系统环境变量
- 作用域: 所有shell
- 设置方式:启动加载
-
环境变量
- 作用域: 当前shell及其子shell
- 设置方式: export、 declare -x
-
自定义变量
- 作用域: 当前shell
- 设置方式: 使用=赋值
- 类型: 字符串、整形、浮点型、日期型
#! /bin/bash
# 变量名=变量值 等号左右不能有空格
page_num=2
page_size=1
# 可以将命令赋值给变量
_ls=ls
# 默认为字符串,不会进行运算
total=page_size*page_num
# total --> "page_size*page_num"
# 声明为整形
let total=page_size*page_num
declare -i total=page_size*page_num
# 声明环境变量
export total
declare -x total
declare命令语法:
declare [+/-][rxi][变量名称=设置值] 或 declare -f
参数:
- +/- "-"可用来指定变量的属性,"+"则是取消变量所设的属性。
- -f 仅显示函数。
- r 将变量设置为只读。
- x 指定的变量会成为环境变量,可供shell以外的程序来使用。
- i [设置值]可以是数值,字符串或运算式。
- -p 显示被声明的变量的变量类型
- a 将变量声明为数组类型
1.2 系统环境变量
- $0: 当前shell脚本文件名,可以使用2获取传入参数
- $#: 传入参数的个数,可以用来判断有无参数传入
- $*: 传入的所有参数
- $?: 上条命令执行的状态码,可以用来判断是否为0
- $PS1: shell的命令提示符
- $HOME: 用户目录
- $PATH: 全局命令搜索路径,一般使用PATH=$PATH:[新增路径]
2. 运算符
2.2 算术运算符
| 运算符 | 说明 | 举例 |
|---|---|---|
| + | 加法 | expr \$a + $b 结果为 30。 |
| - | 减法 | expr \$a - $b 结果为 -10。 |
| * | 乘法 | expr \$a \* $b 结果为 200。 |
| / | 除法 | expr \$b / $a 结果为 2。 |
| % | 取余 | expr \$b % $a 结果为 0。 |
| = | 赋值 | a=$b 把变量 b 的值赋给 a。 |
| == | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
| != | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
2.3 关系运算符
| 运算符 | 说明 | 举例 |
|---|---|---|
| -eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
| -ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
| -gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
| -lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
| -ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
| -le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
2.4 逻辑运算符
| 运算符 | 说明 | 举例 |
|---|---|---|
| && | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
| || | 逻辑的 OR | [[ $a -lt 100 | $b -gt 100 ]] 返回 true |
2.5 字符串运算符
| 运算符 | 说明 | 举例 |
|---|---|---|
| = | 检测两个字符串是否相等,相等返回 true。 | [ $a = $b ] 返回 false。 |
| != | 检测两个字符串是否不相等,不相等返回 true。 | [ $a != $b ] 返回 true。 |
| -z | 检测字符串长度是否为0,为0返回 true。 | [ -z $a ] 返回 false。 |
| -n | 检测字符串长度是否不为 0,不为 0 返回 true。 | [ -n "$a" ] 返回 true。 |
| $ | 检测字符串是否不为空,不为空返回 true。 | [ $a ] 返回 true。 |
2.6 其他符号
3. 分支
# 第一种形式:
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
# 第二种形式:
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
4. 循环
- while循环
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
- until循环
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
- for循环
for loop in {1..5}
do
echo "The value is: $loop"
done
5. 函数
- 语法1
funcName(){
echo "function!";
}
- 语法2
function funcName(){
echo "function!";
}
- 参数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
6. 模块化
模块化的原理是在当前shell内执行函数文件
语法: source [函数库路径]
实例:
# 文件1
function add(){
declare -i result=$1+$2
echo $result
}
# 文件2
source './文件1'
total=${add 1 2}
echo $total
7. 注意事项
-
空格和引号:Shell对空格和引号的使用非常敏感。确保在适当的位置使用空格来分隔命令和参数,但不要在变量赋值或条件判断等语句中的等号两边使用空格。同时,使用引号(单引号或双引号)来引用包含空格或特殊字符的参数,以避免解析错误。
-
转义字符:某些特殊字符具有特殊意义,例如
\$、"、\等,如果想要使用它们的字面值,需要使用转义字符\进行转义。例如,要打印"$10",可以使用echo "\$10"。 -
变量扩展:在使用变量时,确保适当地进行变量扩展。使用
$符号来引用变量的值,并使用大括号{}来明确界定变量的范围。例如,${name}用于引用变量name的值。 -
文件路径:在编写脚本时,要小心处理文件路径。使用相对路径或绝对路径时要确保路径的正确性,并注意文件和目录的权限。
-
错误处理:在脚本中考虑错误处理是很重要的。使用条件语句和返回值来检查命令是否成功执行,并采取相应的操作,例如输出错误消息、终止脚本等。
-
注释:使用注释来解释脚本的功能和逻辑,使其更易读和易于维护。使用
#符号来注释单行,或使用:来注释多行。 -
输入输出重定向:使用重定向符号
>和>>来将命令的输出重定向到文件,使用<来将文件作为命令的输入。同时,使用管道符号|将命令的输出传递给另一个命令进行处理。 -
运行权限:在运行Shell脚本之前,确保脚本文件具有执行权限。可以使用
chmod +x script.sh命令添加执行权限。