Shell 脚本实践

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 cgg
    echo $a$b
    # hello lochhello cgg
    echo $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)
    
    # or
    
    array_name=(
    value0
    value1
    value2
    )
    
    # or
    
    arra_name[0]=value0
    
  • 读取数组

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

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

脚本传参

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

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

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

# 1 2 3

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

Shell 运算符

  • 算数运算符

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

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

    val=`expr 2 + 2`
    

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

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

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

  • 关系运算符

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

    运算符 说明 举例
    -eq 是否相等 [ aeq b ]
    -ne 是否不等 [ ane b ]
    -gt 是否左大于右 [ agt b ]
    -lt 是否左小于右 [ alt b ]
    -ge 是否左大于等于右 [ age b ]
    -le 是否左小于等于右 [ ale b ]
  • 布尔运算符

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

    运算符 说明 举例
    ! [ !false ]
    !与false之间没有空格
    -o [ alt20o b -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 World
echo "\"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" 姓名 性别 体重kg
printf "%-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 语句

    # 写法1
    if [condition]
    then 
        command1
        ...
    fi
    
    # 写法2
    if [condition]; then command1; fi
    
    # 写法3
    if [condition]
    then 
        command1
    else 
        command2
    fi
    
    # 写法4
    if [condition1] 
    then 
        command1
    elif [condition2]
    then 
        command2
    else 
        command3
    fi
    
  • for 循环

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

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

  • while 循环

    while [condition]
    do
        command1
    done
    # while 可以读取键盘信息
    while read FILM
    do 
        echo $FILM
    done
    
  • until 循环

    until [condition]
    do
        command1
    done
    

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

  • case 多选语句

    case val in
    mode1)
        command1
        ;;
    mode2)
        command2
        ;;
    *)
        defaultCommand
        ;;
    esac
    

    *) 为 default 默认执行项

  • break 和 continue

    break 结束循环

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


Shell 函数

函数定义通用格式

[ function ] funname [()]
{
    action;
    [return int;]
}
# []中为可选项

demoFun(){
    echo 'test func'
}
demoFun
echo $?
# $? == 0

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

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

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

输入输出重定向

输入重定向

read FILM < hello
echo $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 中定义的变量和函数

**

前行的路上,感谢您的鼓励!!

**

猜你喜欢

转载自blog.csdn.net/lzch2105/article/details/53996419