Shell 脚本编程

命令

echo 命令

  • echo -n:不进行换行
  • echo -e:启用转义字符,echo 默认是不会识别转义字符的。

read 命令

  • read variable:读取变量给 variable
  • read 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 (全局替换)

位置参量

  • $nn为数字,$0代表命令本身,$1-9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如 $9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
  • $#:用来统计参数的个数
  • $@:会将命令行的所有的参数当做同一个字符串中的多个独立单词
  • $*:会将命令行的参数当做一个参数来保存

函数

#!/bin/bash
# 函数定义,函数定义时不能有参数,但是调用时可以传参数,并且给它传递什么参数它就接收什么参数
function hello(){
    str = "hello, world"
    echo $str
    return $str # 可以没有返回值
}
# 函数调用,直接使用函数名即可,后面可以传递参数也可以不传递参数,参数要使用空格隔开
hello

转载规则

《Shell 脚本编程》Konata 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。
  目录