简介

  • Shell是用户与内核进行交互操作的一种接口,目前最流行的Shell称为bash Shell
  • Shell也是一门编程语言<解释型的编程语言>,即shell脚本
  • 一个系统可以存在多个shell,可以通过cat /etc/shells命令查看系统中安装的shell,不同的shell可能支持的命令语法是不相同的

变量

  1. 输出变量的值
    • echo $JAVA_HOME
  2. 定义变量
    • 变量=值(例如STR=abc)
    • 等号两侧不能有空格
    • 变量名称一般习惯为大写
    • 双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意
  3. 撤销变量
    • A=10
    • unset A
  4. 声明静态变量(不能unset)
    • readonly B=20
  5. 提升为全局变量(仅在当前进程和子进程有效)
    • export JAVA_HOME=/root/apps/jdk1.8.0_40
  6. 将命令的返回值赋给变量
    • A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
    • A=$(ls -la) 等价于反引号
  7. 特殊变量
    • $? 表示上一个命令退出的状态(0表示成功执行)
    • $$ 表示当前进程编号
    • $0 表示当前脚本名称
    • $n 表示n位置的输入参数(n代表数字,n>=1)
    • $# 表示参数的个数,常用于循环
    • $*和$@ 都表示参数列表
    • 注:加上双引号,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n"的形式输出所有参数
  8. 变量的范围
    • export A=1 在自己的Shell进程及其子进程有效
    • A=1 只对自己所在的Shell进程有效
    • script.sh 在当前登录的Shell进程中source script.sh时,脚本中定义的变量也会进入当前登录的进程

运算符

  1. 格式
    • expr m + n
    • 注:expr运算符间要有空格
  2. 实例演示(2+3)x4
    • expr `expr 2 + 3` \* 4
    • A=$(expr `expr 2 + 3` \* 4)

流程控制

for循环

  1. 第一种

    1
    2
    3
    4
    5
    6
    7
    8
    for N in 1 2 3
    do
    echo $N
    done
    for N in 1 2 3;do echo $N;done
    for N in {1..3};do echo $N;done
  2. 第二种

    1
    2
    3
    4
    5
    6
    for ((i = 0; i <= 5; i++))
    do
    echo "welcome $i times"
    done
    for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done

while循环

  1. 第一种
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while true
    do
    echo $A
    done
    while true;do echo $A;done
    i = 1
    while ((i<=3))
    do
    echo $i
    let i++
    done

case条件语句

  1. 格式
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    case $1 in
    start)
    echo "starting"
    ;;
    stop)
    echo "stoping"
    ;;
    *)
    echo "default"
    esac

read命令

  • read -p(提示语句)-n(字符个数) -t(等待时间)
  • read -p “please input your name: “ name

if判断

  1. 语法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    read -p "请输入姓名:" NAME
    if [ $NAME=root ]
    then
    echo "hello"$root
    elif [ $NAME=bob ]
    then
    echo "hi"$root
    else
    echo "SB"
    fi

注:if和[]之间以及[]内都必须要有空格

  1. 判断语句格式
    [ 1 -eq 2 ] && echo “ok” || echo “no”
  2. 常见判断条件
    • = 字符串比较
    • -lt 小于
    • -le 小于等于
    • -eq 等于
    • -gt 大于
    • -ge 大于等于
    • -ne 不等于
    • -r 有读的权限
    • -w 有写的权限
    • -x 有执行的权限
    • -f 文件存在并且是一个常规文件
    • -s 文件存在且不为空
    • -d 文件存在并且是一个目录
    • -b 文件存在并且是一个设备文件
    • -L 文件存在并且是一个链接文件

自定义函数

  1. 声明的三种方式
    • function start()
    • function start
    • start()
  2. 实例

    1
    2
    3
    4
    5
    6
    7
    function fsum()
    {
    return $(($1+$2));
    }
    read -p "please input two num: " a b
    fsum $a $b;
    echo $?;
  3. 注意点

    • 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。
    • 函数返回值,只能通过$?系统变量获得。加:return返回指定值,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

脚本调试

  • sh -vx xxx.sh
  • 在脚本中增加set -x

高级命令行文本处理工具

cut

  1. 格式
    • cut -d ‘分隔符’ -f fileds 用于有特定分隔字符
    • cut -c 字符区间 用于排列整齐的信息
  2. 选项与参数
    -d:后面接分隔符与-f一起使用
    -f:用-d将一段信息分割成多段,用-f取出第几段
    -c:以字符的单位取出固定字符区间
  3. 实例
    取出第3个和第五个路径
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/apps/jdk1.8.0_40/bin:/root/bin
    echo $PATH | cut -d ':' -f 3,5
    结果:/usr/sbin:/root/apps/jdk1.8.0_40/bin

sort

  1. 格式
    sort -[fbMnrutk] [file or stdin]
  2. 选项与参数
    -f:忽略大小写差异
    -b:忽略最前面的空格部分
    -M:以月份的名字来排序
    -n:使用数字排序(默认是字符)
    -r:倒序
    -u:就是uniq,去掉重复值
    -t:分隔符,和-k一起使用
    -k:以指定区间的值来排序
  3. 实例
    cat /etc/passwd | sort -t ':' -k 3nr

wc

  1. 格式
    wc -[lwm]
  2. 选项与参数
    -l:仅列出列
    -w:仅列出多少字(英文单词)
    -m:多少字符
  3. 实例
    wc -l /etc/passwd

sed

  1. 简介
    sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。
  2. 命令(具体使用参考相关手册)
  • 删除:d
  • 替换:s
  • 多点编辑:e
  • 从文件读入:r
  • 写入文件:w
  • 追加:a
  • 插入:i
  • 下一个:n
  • 变形:y
  • 退出:q
  • 保持和获取:h和G
  • 保持和互换:h和X
  1. 脚本
    Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

awk

  1. 简介
    awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
  2. 语法
    具体功能十分强大,awk编程内容极多,更多请参考http://www.gnu.org/software/gawk/manual/gawk.html

最后更新: 2020年07月27日 03:48

原始链接: https://www.lousenjay.top/2018/08/09/Shell编程(CentOS7)/