命令
echo 命令
echo -n:不进行换行echo -e:启用转义字符,echo 默认是不会识别转义字符的。
read 命令
read variable:读取变量给 variableread x y:可同时读取多个变量read:自动读给内置的 REPLY 变量read -p "please input:":自动读给内置的 REPLY 变量,带有提示
read命令后面可以不跟变量,可以带参数,可以跟多个变量。
条件测试
bash 允许测试两种类型的条件:命令成功或失败、表达式为真或假
测试的退出状态为 0 表示命令成功或表达式为真,非 0 表示命令失败或表达式为假,状态变量 $? 中保存命令退出状态的值
表达式测试包括:字符串测试、整数测试、文件测试
# 使用 test 命令测试
x=5;y=10
test $x -gt $y
echo $?
# test 命令可以用方括号代替
x=5;y=10
[ $x -gt $y ] # 方括号的两边必须留空格
echo $?
字符串测试
| 表达式 | 解释 | 
|---|---|
[ -z str ] | 
字符串 str 长度为零,返回真 | 
[ -n str ] | 
字符串 str 长度不为零,返回真 | 
[ str1 = str2 ] | 
两个字符串相等 | 
[ str1 != str2 ] | 
两个字符串不相等 | 
整数测试
| 表达式 | 解释 | 
|---|---|
[ int1 -eq int2 ] | 
int1 等于 int2 | 
[ int1 -ne int2 ] | 
int1 不等于 int2 | 
[ int1 -gt int2 ] | 
int1 大于 int2 | 
[ int1 -ge int2 ] | 
int1 大于或等于 int2 | 
[ int1 -lt int2 ] | 
int1 小于 int2 | 
[ int1 -le int2 ] | 
int1 小于或等于 int2 | 
整数测试也可以使用 let 命令或者双圆括号,使用 > 、 < 、 >= 、 <= 、 == 、 != 操作符,例如:
x=1; let "$x == 1"; echo $? # 使用 let
x=1; (("$x == 1")); echo $? # 使用双圆括号
逻辑测试
| 表达式 | 解释 | 
|---|---|
[ expr1 -a expr2 ] | 
逻辑与,都为真返回真 | 
[ expr1 -o expr2 ] | 
逻辑或,存在真返回真 | 
[ ! expr ] | 
逻辑非 | 
表达式不能随便加括号,否则不能正确解析。
文件测试
文件测试:文件是否存在、文件属性、访问权限等
| 表达式 | 解释 | 
|---|---|
[ -f fname ] | 
fname 存在且是普通文件时返回真 | 
[ -L fname ] | 
fname 存在且是链接文件时返回真 | 
[ -d fname ] | 
fname 存在且是目录时返回真 | 
[ -e fname ] | 
fname 为文件或目录存在返回真 | 
[ -s fname ] | 
fname 存在且大小大于 0 时返回真 | 
[ -r fname ] | 
fname 存在且可读时返回真 | 
[ -w fname ] | 
fname 存在且可写时返回真 | 
[ -x fname ] | 
fname 存在且可执行时返回真 | 
检查空值
[ "$name" = "" ]
[ ! "$name" ]
[ "X${name}" != "X" ]
控制语句
if 条件语句
if expr1
then 
    commands1
elif expr2
then
    commands2
elif expr3
then
    : # : 表示什么都不干
else
    commnads3
fi
case 选择语句
每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break
case expr in
    pattern1)
    commands1
    ;;
    pattern2)
    commands2
    ;;
    pattern3)
    commands3
    ;;
    *) # 以上都没有匹配到时执行
    commands3
    ;;
esac
for 循环语句
for variable in list # 每一次循环将 list 的一个值赋给变量
do            # 循环开始
    commands  # 循环体
done          # 循环结束标志
while 循环语句
while expr # 满足条件进入循环
do
    commands
done
until 循环语句
until expr # 不满足条件进入循环
do
    commands
done
select 循环语句
# 主要用于创建菜单,菜单项按数字顺序排列,等待用户输入。用户输入的值会保存在内置变量 REPLY 中
select variable in list
do
    commands
done
字符串操作
| 操作 | 解释 | 
|---|---|
${#var} | 
返回字符串变量 var 的长度 | 
${var:m} | 
返回 ${var} 中从第 m 个字符到最后的部分 | 
${var: m:len} | 
返回 ${var} 中从第 m 个字符开始,长度为 len 的部分 | 
${var#pattern} | 
删除 ${var} 中开头部分与 pattern 匹配的最小部分 | 
${var##pattern} | 
删除 ${var} 中开头部分与 pattern 匹配的最大部分 | 
${var%pattern} | 
删除 ${var} 中结尾部分与 pattern 匹配的最小部分 | 
${var%%pattern} | 
删除 ${var} 中结尾部分与 pattern 匹配的最大部分 | 
${var/old/new} | 
用 new 替换 ${var} 中第一次出现的 old | 
${var//old/new} | 
用 new 替换 ${var} 中所有的 old (全局替换) | 
位置参量
$n:n为数字,$0代表命令本身,$1-9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}$#:用来统计参数的个数$@:会将命令行的所有的参数当做同一个字符串中的多个独立单词$*:会将命令行的参数当做一个参数来保存
函数
#!/bin/bash
# 函数定义,函数定义时不能有参数,但是调用时可以传参数,并且给它传递什么参数它就接收什么参数
function hello(){
    str = "hello, world"
    echo $str
    return $str # 可以没有返回值
}
# 函数调用,直接使用函数名即可,后面可以传递参数也可以不传递参数,参数要使用空格隔开
hello