• Shell脚本学习


    为了捞取日志,自己用python写了一些东西,大致套路就是读取写入文件的操作,放到linux上跑。实际使用时发现要操作的文件有时比较大,直接打开文件找需要的东西可能会有一些效率问题。所以学习一下shell脚本,看一下能不能用这种方法来直接监听日志取到需要的东西。以下是自己学习时的一些笔记。

    Shell脚本的运行

    shell脚本第一行一般都是如下内容。#!开头,告诉系统使用什么解释器(使用哪一种Shell)

    #!/bin/bash

    如何运行:

    两种方法。

    作为可执行程序的话,cd到相应目录后,运行以下命令

    chmod +x ./test.sh  #使脚本具有执行权限
    ./test.sh  #执行脚本。一定要写成./test.sh,意味着在当前目录找。
    # 如果直接写test.sh,系统会去PATH里找test.sh,而PATH里一般只有/bin, /sbin, /usr/bin,/usr/sbin

    或者可以直接sh test.sh。这样的话不用在第一行指定解释器

    数据类型

    变量

    变量定义:等号两端不能有空格

    变量可以指定为只读变量。只读变量的值不可以再改变。前面加readonly(比如,readonly aaa)

    变量使用:在变量名前加dollar符。变量名外用大括号括起来,以表明变量的边界(比如${aaa}像这样)

    只有使用变量时才加$。如果是给变量重新赋值则不需要

    删除变量(非只读变量才可以被删除):

    unset variable_name

    字符串

    字符串可以用单引号、双引号,也可以不用引号。

    区别:

    单引号:单引号内内容原样输出,变量无法生效。单引号内不能有单个的单引号,必须成对出现

    双引号:可以有变量,可以有转义字符

    字符串长度

    ${#variable_name} # 井号获取长度

    截取字符

    ${variable_name:startInd:endInd} # 截取第startInd个字符到第endInd个字符

    查找字符串

    echo `expr index "$variable_name" io`  # 查找字符串中第一个符合条件的字符位置。io表示查找条件是i或者o
    # 注意expr后面是`不是'

    数组

    bash只支持一维数组,初始化不需要指定大小。元素之间用空格分隔

    array_name=(value1 ... valuen)

    也可以使用下标指定值

    array_name[0]=value

    读取数组:

    跟变量一样,用${}括起来

    ${array_name[ind]}

    获取数组中所有元素使用*或者@符号

    ${the_array[*]}
    ${the_array[@]}

    获取数组长度和获取字符串的长度一样,用#号

    ${#the_array[*]}
    ${#the_array[@]}

    一些命令:

    echo和printf

    echo和printf都是用于字符串输出。

    printf比使用echo移植性好,因为printf由POSIX标准定义。

    echo

    显示普通字符串和显示转义字符串

    echo "It is a test" # 显示普通字符串
    echo It is a test # 等同于带引号情况
    echo ""It is a test"" # 显示转义字符
    echo "It is a test" # 等同于带引号的情况

    显示变量。以下代码完成的是读取输入,然后打印结果

    test.sh

    执行sh test.sh后结果为 OK It is a test

    #!/bin/sh
    read name # 读取输入,指定给name变量
    echo "$name It is a test" # 打印变量值和固定文本的组合结果

    显示换行

    echo -e "OK!
    "    # -e 开启转义
    echo "It is a test"

    显示不换行

    #!/bin/sh
    echo -e "OK!c"  #c是不换行
    echo "It is a test"

    显示结果定向到文件

    echo "It is a test" > myfile

    原样输出字符串,不转义不取变量值

    echo '$name"'   # 输出结果是$name"

    显示命令执行结果

    echo `date`  # 使用反引号`
    
    # 打印结果是当前日期时间,精确到秒
    # Thu Jul 24 10:08:46 CST 2014

    printf

    printf语法:

    printf  format-string  [arguments...]

    格式化的时候有一些格式替代符,比如%s(字符串),%c(这个没查到给谁占位,待补充),%d(十进制整数),%f(浮点数)

    %-10s表示宽度为10个字符(-表示左对齐,不写-就表示右对齐),不足则以空格自动填充,超过的话会将内容全部显示

    %-4.2f指格式化为小数,.2表示保留2位小数

    一些其他用法

    printf %s abc def # 如果只指定了一种格式,后面给了多个参数,那么所有参数都用格式化的要求来输出

    如果没有给出参数,那么输出时%s用NULL代替,%d用0代替

    反义序列

    a:警告字符

    :后退

    c:抑制(不显示)输出结果中任何结尾的换行字符(只有靠%b格式来控制参数时有效)

    f:换页

    :换行

    :回车

    :水平制表符

    v:垂直制表符

    \:反斜杠字符

    ddd:表示1到3位数的八进制值的字符。仅在格式字符串中有效

    ddd:表示1到3位的八进制值字符

    test

    用于检查某个条件是否成立。可以进行数值、字符、文件的测试

    数值测试

    -eq:等于

    -ne:不等于

    -gt:大于

    -ge:大于等于

    -lt:小于

    -le:小于等于

    字符串测试

    =:等于

    !=:不等于

    -z:是0

    -n:非0

    文件测试

    -e 文件名:文件存在为真

    -r 文件名:文件存在且可读为真

    -w 文件名:文件存在且可写为真

    -x 文件名:文件存在且可执行为真

    -s 文件名:文件存在且至少有一个字符则为真

    -d 文件名:文件存在且为目录则为真

    -f 文件名:文件存在且为普通文件则为真

    -c 文件名:文件存在且为字符型特殊文件则为真

    -b 文件名:文件存在且为块特殊文件则为真

  • 相关阅读:
    【记中关村.西北食府.兰州拉面】诗一首
    【新发地寻柑桔收购商】 诗一首
    【糖葫芦】诗一首
    【板栗饼】诗一首
    【白云观寻道】诗一首
    Android开发常用网站汇总
    BZOJ 2281 消失之物
    BZOJ 2281 消失之物
    BZOJ 4033: [HAOI2015]树上染色
    BZOJ 4033: [HAOI2015]树上染色
  • 原文地址:https://www.cnblogs.com/wuhuohanke/p/10083798.html
Copyright © 2020-2023  润新知