Shell 脚本实践

来源:互联网 发布:软件测试的目的 编辑:程序博客网 时间:2024/04/26 09:21

Shell 脚本实践


Shell 用 C 语言编写的程序,既是一种命令行语言,又是一种程序设计语言,用 shell 编写的称为脚本程序(Shell Script)

两种运行方法:

1、作为可执行程序

chmod +x ./test.sh./test.sh

2、作为解释器参数

sh test.sh

Shell 变量

  • 变量名不加 $ ,且变量名与等号间不能有空格

  • 变量名不能有空格,不能用标点,不能用 bash 关键字

  • 可以用语句给变量赋值

    for file in `ls /etc`

    遍历 etc 中的文件

  • 使用变量,只需要在变量名前添加 $ ,加花括号可以帮助解释器识别变量名

    echo "Hello, ${name}!"
  • 已经定义的变量可以被重新赋值

    myUrl="http://www.baidu.com"myUrl="http://www.google.com"
  • 可以声明只读变量

    readonly myUrl
  • 删除变量

    unset myUrl

Shell 字符串

  • 单引号字符串:任何单引号内的字符串都会原样输出,变量无效

  • 双引号字符串:可以在双引号字符串中输出变量,同时也可以存在转义字符

  • 拼接字符串

    echo $a $b# hello loch hello cggecho $a$b# hello lochhello cggecho $a + $b# hello loch + hello cgg
  • 获取字符串长度

    echo ${#a}# 10 ("hello loch").length
  • 提取字符串

    echo ${a:1:4}# 从第二个字符开始提取四个字符
  • 查找字符

    echo `expr index "a" is`# error: expr syntax error

Shell 数组

  • 只支持一维数组

    array_name=(value0 value1 value2 value3)# orarray_name=(value0value1value2)# orarra_name[0]=value0
  • 读取数组

    $(array_name[0])
  • 获取数组长度

    echo ${#array_name[@]}# 3echo ${#array_name[*]}

脚本传参

我们可以在执行脚本时,传递参数,脚本内获取参数的格式为:

$n# n 为脚本参数的顺序,从1开始# $0 为当前执行的文件名
特殊参数 说明 $# 传递的参数个数 $* 将所有参数输出为一个字符串 $$ 输出脚本当前运行的进程 ID $! 后台运行的最后一个进程的 ID,测试失败,返回空 $@ 所有参数的数组引用 $- 显示 Shell 使用的当前选项,与set命令功能相同 $? 显示最后的命令退出状态,0表示没错误

# @ 的区别
for i in “;doechoi
done

# 1 2 3for i in "$@"; do     echo $idone # 循环体执行了3次

Shell 运算符

  • 算数运算符

    原生 bash 不支持简单的数学运算,需要借助 expr

    expr 是一款表达式计算工具,可以完成表达式的求值

    val=`expr 2 + 2`

    注意:表达式和运算符之间要有空格,2+2不会执行加法运算,而是作为字符串存在;只能进行整数运算

    运算符 举例 +,-,*,/,% `expr a+b` = b=$a == if[a==b] != if[a!=b]

    注意:*前必须添加反斜杠 \ 才能进行乘法运算

  • 关系运算符

    注意:关系运算只支持数字,或者值为数字的字符串,空格很必要

    运算符 说明 举例 -eq 是否相等 [ aeqb ] -ne 是否不等 [ aneb ] -gt 是否左大于右 [ agtb ] -lt 是否左小于右 [ altb ] -ge 是否左大于等于右 [ ageb ] -le 是否左小于等于右 [ aleb ]
  • 布尔运算符

    注意:布尔运算符的成员为布尔值或值为布尔类型的表达式

    运算符 说明 举例 ! 非 [ !false ]
    !与false之间没有空格 -o 或 [ alt20ob -gt 100 ] -a 与 类比上面的或
  • 逻辑运算符

    && 与
    || 或

    与布尔运算符有什么区别。。

  • 字符串运算符

    运算符 说明 举例 = 是否相等 [ a=b ] != 是否不等 [ a!=b ] -z 是否长度为 0 [ -z $a ] -n 是否长度不为 0 [ -n $a ] str 是否不为空 [ $a ]
  • 文件测试运算符

    操作符 说明 -b file 是否为块设备文件
    Linux秉承一切都是文件的设计思想,将所有的块设备也看成文件,通常存放在/dev目录下,磁盘是常见块设备 -c file 是否是字符设备文件
    键盘和打印机是常见的字符设备 -d file 是否是目录 -g file 是否设置了 SGID 位
    chmod g+s filename -k file 是否设置了 SBIT 位 -p file 是否是有名管道 -u file 是否设置了 SUID 位 -r file 是否可读 -w file 是否可写 -x file 是否可执行 -s file 是否为空 -e file 是否存在

Shell echo

echo "Hello World"echo Hello Worldecho "\"Hello World"\"echo "Hello ${name}"echo "Hello, \n"# 显示结果定向到文件,覆盖原文件内容或者创建新文件echo "Hello World" > myfile# 显示命令执行结果echo `date`

Shell printf

printf format-string [arguments...]# format-string 格式控制字符串# arguments 参数列表

printf 没有自动换行,需要手动添加 \n

printf "%-10s %-8s %-4s\n" 姓名 性别 体重kgprintf "%-10s %-8s %-4.2f\n" 自超 男 90.1234# 姓名    性别    体重kg# 自超    男      90.12

%-10s 表示一个宽度为10个字符的左对齐的字符串,-表示左对齐,没有-表示默认右对齐,如果超过10个字符,也会显示,但是格式会被打乱

%-4.2f 表示浮点数,保留两个小数

%c 表示单个字符

%d 表示整数

转义序列 说明 \a 警告字符 \b 后退 \f 换页 \n 换行 \r 回车 \t 水平制表符 \v 垂直制表符 \ 反斜杠 \ \ddd 表示1到3位的八进制字符 \0ddd 表示1到3位的八进制字符

流程控制

shell 的流程控制分支不能为空

  • if 语句

    # 写法1if [condition]then     command1    ...fi# 写法2if [condition]; then command1; fi# 写法3if [condition]then     command1else     command2fi# 写法4if [condition1] then     command1elif [condition2]then     command2else     command3fi
  • for 循环

    for var in item1 item2 ... do     command1    ...done

    通过 $var 变量名来获取当前循环过程的值

  • while 循环

    while [condition]do    command1done# while 可以读取键盘信息while read FILMdo     echo $FILMdone
  • until 循环

    until [condition]do    command1done

    虽然 until 在前,但是每次判断在循环末尾,所以循环体至少会执行一次

  • case 多选语句

    case val inmode1)    command1    ;;mode2)    command2    ;;*)    defaultCommand    ;;esac

    *) 为 default 默认执行项

  • break 和 continue

    break 结束循环

    continue 提前结束当前循环,进入下一次循环


Shell 函数

函数定义通用格式

[ function ] funname [()]{    action;    [return int;]}# []中为可选项demoFun(){    echo 'test func'}demoFunecho $?# $? == 0

注意:所有函数必须先定义后调用
$?为函数返回值的调用

获取函数参数,1,2,,,,当 n>=10 时,${n}来获取参数

特殊参数 说明 $# 传递到函数的参数个数 $* 以单字符串显示连接显示所有参数 $@ 使用时用引号包裹,返回可遍历的参数列表

输入输出重定向

输入重定向

read FILM < helloecho $FILM# 获取 hello 文件中的内容,并输出到终端

输出重定向

echo 'test' > hello# 将本要输出到终端的 'test' 输出到 hello 文件中,覆盖 hello 中原有的内容
定向符 说明 command > file 重定向输出覆盖 command < file 重定向从文件获取输入 command >> file 重定向输出追加 n > file 将文件描述符为 n 的文件重定向到 file n >> file 追加 n >& m 将输出文件 m n 合并 n <& m 将输入文件 m n 合并

文件描述符 0 表示标准输入 STDIN
1 表示标准输出 STDOUT
2 表示标准错误输出 STDERR


文件引用

#!/bin/bash#. ./CONFIG.sh# 引入了 CONFIG.sh 后,可以使用在 CONFIG 中定义的变量和函数
0 0
原创粉丝点击