命令
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