shell语法及进度条

来源:互联网 发布:php开源在线教育系统 编辑:程序博客网 时间:2024/06/10 19:01

shell语法

1.条件测试

  • test和[
    测试条件是否成立, 结果为真,退出码为0,否则为1(与c语言相反),不支持通配符和正则表达式
    :[ 与参数之间必须加空格
    [[ ]]也可以用于条件测试,支持通配符和正则表达式

整数比较: -eq(相等)、-lt(小于)、-le(小于等于)、-gt(大于)、-ge(大于等于)、-ne(不等)
字符串比较:==(等于) !=(不等于)
$?用来判断退出码

#!/bin/bashval=5test $val -le 10echo $?[ $val -gt 10 ]echo $?

这里写图片描述

常见的测试命令:
[ -d DIR ] DIR存在且为目录则为真
[ -f FILE ] FILE存在且为普通文件则为真
[ -z str ] str长度为0则为真
[ -n str ] str长度非0则为真
与c语言相同,测试条件之间还可以做与、或、非逻辑运算
-a(与) -o(或) !(非)
这里写图片描述
如果str没有被定义,则shell会将其看做空字符串,会造成测试条件的语法错误。

  • if/then/elif/else/fi
    (1)if、else支持嵌套
    (2)if语句中不允许出现空的代码块
    (3):也是一条命令,什么也不做但恒成立
    (4)if检测语句的退出码
    (5)因为没有{},所以以fi结尾
    read:等待用户输入一行字符串,将该字符串存到shell变量中
read val if [ $val -le 50 ]thenecho "A"elseecho "B"fi

这里写图片描述
&&和||也可以用在if中,用来连接两个测试条件

  • case和esac
    shell中的case语句可以匹配字符串和正则表达式,分支以;;结尾,找到匹配的分支并执行之后直接跳到esac之后。支持通配符和正则表达式
read val case $val in    start | -s | -a)         echo "start"        ;;      [Ss]top)        echo "stop"        ;;      [0-9])        echo "hello"        ;;      *)          echo "***********"esac   

这里写图片描述

2.循环语句

  • for/do/done
for (( i=0; i<10; i++ ))  //(())括起来的内容,可以做c规范来操作do    echo "$i"done
for i in {0..9}do    echo "$i"done
  • while/do/done
i=0while [ $i -lt 10 ]do    echo "$i"    (( i++ ))done
  • until/do/done 直到条件不成立,否则一直做这件事情
i=0until [ $i -gt 10 ]do    echo "$i"    let i++ done

3.位置参数和特殊变量
$0-n 命令行参数
$# 命令行参数的个数减1
$@ 命令行参数的列表
$$ 当前shell的进程号
位置参数用shift左移 如: shift 1 $3就变成$2

4.函数
(1)shell中函数必须先定义再使用
(2)函数体的 { 和后面的命令之间必须有空格或换行,最后一条命令要和 } 写在一行,则必须加‘;’
(3)定义函数时并不执行里面的命令,到后面调用时才执行
(4)关键字function可以省略,()不可以省略,代码块不能为空

//求最大最小值function myfun(){    max=$1    min=$1    for i in $@    do          if [ $min -ge $i ]; then            min=$i          fi          if [ $max -le $i ]; then            max=$i        fi      done}myfun $@   //调用函数,传参echo "max=$max"echo "min=$min"

这里写图片描述

5.数组
(1)bash支持一维数组,不限定数组大小,下标从0开始
(2)用括号表示数组,元素用空格分隔
(3)不会越界,没有类型
例:arr=(1 3.14 ‘c’ “hello world”)
提取数组元素: ${arr[i]},使用@或*可以获取数组中所有元素

shell编写进度条

#!/bin/bashi=0str=""arr=("|" "/" "-" "\\")while [ $i -le 100 ]do    let index=i%4    printf "[%-100s][%d%%][%c]\r" "$str" "$i" "${arr[$index]}"  //printf也是一条命令    sleep 0.1    let i++    str+='#'  //字符串连接done  

这里写图片描述

还有一种使用了简单配色方案的进度条

printf如下:

 printf "[%-100s][%d%%][\e[54;41;1m%c\e[0m]\r" "$str" "$i" "${arr[$index]}"

这里写图片描述