Shell编程

shell是什么
相当于一个命令解释器,在操作系统和应用程序之间的一个命令翻译工具。

应用领域

测试环境搭建,ci/cd使用。
学习目标,使用shell脚本分析日志文件,搭建部署测试环境,开发运行环境

常用命令

1,head

head + filename 默认获取文件前10行
-n n为显示前几行的数字参数

2,tail

tail + filename 默认获取文件尾10行

3,cut

取出文本指定的列
默认以空格或者tab见进行分割(不支持不规则的空格分割)
选项
-d 指定分隔符
-f 指定获取的分割的部分的序号

4,unique

去除重复的内容
选项
-d 仅打印有重复的元素
-c 打印元素重复的个数

5,sort

对文本的内容进行排序
默认以字符的ascii码值从大到小进行排序
选项
-n 以数值大小排序
-r 倒序
-t 指定分隔符,默认为空格
-knum 指定以某个字段来进行排序
去重操作一般是先sort进行排序之后使用unique来进行去重

6,wc (word count)

计算文本数量
wc -l 打印行数
wc -w 打印单词数
wc -c 打印字节数
wc -L 打印最长的字节数

变量

定义方式

变量名=变量值 =号两边不能有空格,

调用

调用的时候 $变量名
设置字符串的时候,双引号包裹可以正常调用变量 “$变量名”
单引号,所见即所得,不会进行调用

将命令执行结果赋值给变量

var=$(ls /) 括号中进行各种操作command、

声明全局变量

export 变量名,将变量名声明为全局变量。如果一个变量不是全局变量的话,shell脚本无法引用。
export 变量名=值 直接定义并声明为全局变量

  • 创建的全局变量只用于当前的shell线程中,线程之间变量不共用

    声明线程间共用全局变量

    .bashrc 在这个文件中进行声明,随后source .bashrc 之后可以在任意线程中进行调用、

    调用方式总结

    $变量名 在shell脚本中不可这样调用
    “$变量名”
    “$(变量名)” 在shell脚本中进行这样调用
    ‘$变量名’ 不会对变量进行引用。

    内置变量

    ```shell $0 获取当前shell脚本文件名,包括脚本路径 $env 可以查看所有的环境变量 $? 获取前跳命令执行结果 0 成功 ,非0即失败 $n 获取当前执行的脚本的第N个参数值,n=1..9 如果n大于9就要用括号括起 ${10}
  1. <a name="nZ7KT"></a>
  2. ## 数值运算
  3. <a name="qQYjA"></a>
  4. ### 方式1
  5. $((算数表达式)) ,其中的变量可以不加$
  6. <a name="E5wW4"></a>
  7. ### 方式2
  8. expr 算数表达式 表达式中的运算符号需要加一个\来进行转义运算符
  9. <a name="M6DI1"></a>
  10. ## 条件表达式
  11. <a name="4dJl1"></a>
  12. ### 1,返回值
  13. 条件成立,返回0<br />条件不成立,返回1
  14. <a name="E5Fvw"></a>
  15. ### 2,逻辑表达式
  16. && (and)逻辑与 || (or) 逻辑或
  17. <a name="LHQC1"></a>
  18. ### 3,文件表达式
  19. -f 判断输入内容是否是一个文件<br /> -d 判断输入内容是否是一个目录<br /> -x 判断输入内容是否可执行<br /> -e 判断文件是否存在
  20. <a name="bMSgj"></a>
  21. ### 4,数值操作符
  22. n1 -eq n2 相等<br /> n1 -gt n2 大于<br /> n1 -lt n2 小于<br /> n1 -ne n2 不等于
  23. <a name="XJ9ub"></a>
  24. ## shell脚本的编写
  25. shell 脚本文件后缀,命名为.sh<br />脚本执行失败时使用exit返回非0值来退出程序<br />默认缩进为4个空格<br />shell 脚本命名要做到见名知意<br />注释 <br />"#" 号之后为单行注释
  26. <a name="oVF3R"></a>
  27. ### 函数
  28. <a name="k3oj3"></a>
  29. ### 1,编写格式
  30. ```shell
  31. # 两种方式
  32. 函数名(){函数块}
  33. function 函数名 {
  34. }

2,参数

  1. 函数体调用参数
  2. 函数名(){
  3. 函数体 $n
  4. }
  5. 调用函数给函数传参数
  6. 函数名 参数

3,input

 read
        read value
        read -p prompt value 调用处输入
        ex  read -p   "请输入你的年龄" age

        如果不使用变量保存的话,会自动存储在 $REPLY 中供使用

shell脚本中的流程控制

流程控制
    if[ 条件 ]
    then 
    elif [ 条件2 ]
    then
    else  
    fi
    else 下面是没有then的

    if [ 条件 ]
    then 
        条件成立执行代码块
    fi

for 循环
    1, for value in iteor
        do 
            执行语句块
        done
    2, 
        max=10
        for ((i=1;i<=max;i++))  # 需要注意的是这里是用的双括号
        do
            echo "$1"
        done

while
    只要条件满足就一直循环
    while 条件
    do 
        执行语句
    done

Shell 脚本调试

shell脚本的调试,debug 
执行的时候 
bash -x 脚本名即可
++ 表示在运行

文件权限命令控制复习

文件权限问题控制
chmod +x 文件 事后调查
执行.sh后缀文件
在没有执行权限的时候只能 bash 文件名,
或者 .文件名即可

主要复习数值赋权
4.1 先看一下文件的权限格式

[root@qs-wg-db2 scripts]# ll
total 20
-rw-r--r-- 1 oracle oinstall    0 Feb 24 00:00 alertlogbyday.log
-rwxr-xr-x 1 oracle oinstall  430 Feb 20 01:10 alertlogbyday.sh
-rwxr-xr-x 1 oracle oinstall    7 Feb 24 05:00 del_st_arch.log
-rwxr-xr-x 1 oracle oinstall  648 Feb 19 00:51 del_st_archive.sh
-rwxr-xr-x 1 oracle oinstall    9 Feb 24 05:00 max_sn.log
drwxr-xr-x 3 root   root     4096 Feb 23 23:40 pymonitor

ll的结果返回七列,分别表示如下含义:
第一栏  [文件属性]
第二栏  [文件数]
第三栏  [拥有者]
第四栏  [所有者群组]
第五栏  [大小]
第六栏  [建档日期]
第七栏  [档名]

我们设置文件的权限就是这是第一栏里的文件属性。

文件属性这块共有十个字段,如:drwxr-xr-x

我们把这10个列分成4块:[d] [rwx] [r-x] [r-x]
第一块:也就是第一列,用来表示这个文件的类型,有如下值:
    (1)[ d ]则是目录,我这里的是d,表示的是一个目录
    (2)[ - ]则是文件;
    (3)[ l ]则表示为连结档(link file);
    (4)[ b ]则表示为装置文件里面的可供储存的接口设备;
    (5)[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标。
第二块:第 2到4 列,表示文件拥有者的权限。
第三块:第5到7 列,表示拥有者同组人的权限。
第四块:第8到10列,表示是非拥有者组人的权限。

   这些权限均有[rwx] 三个参数表示,而且分别对应不同的位置。每块由3个列组成,每列对应一个值。 [ r ]代表可读、[ w ]代表可写、[ x ]代表可执行。
    举例: 如果拥有者只有只读的权限,那么第2到4列就是[r--],有读写的权限就是[rw-],有读写和执行的权利就是[rwx].

4.2 使用数字赋权
在4.1 中了解准备知识之后,就可以使用数字赋权了。 每块用户有3个权限[rwx]. 他们对应数字:
    r -->4
    w-->2
    x-->1

使用数字赋权的命令格式如下:
    chmod abc filename
其中的abc 分别代表3个数字,并且分别对应问个不同的属组。 即:
    数字a 对应 第2到4位,表示拥有者的权限。
    数字b 对应 第5到7位,表示同组用户的权限。
    数字c 对应第8到10位,表示其他组的权限。

    rwx 对应4,2,1. 那么只读的权限用4表示[r--],读写用6(4+2)表示[rw-],写加执行用7(4+2+1)表示[rwx]。 只读加执行用5(4+1)表示[r-x]。

示例:
    chmod 755 file1
    chmod 777 file1 <==> chmod a=rwx file 
    chmod 771 file  <==> chmod ug=rwx,o=x file 
 转载于 http://blog.itpub.net/25744374/viewspace-751661/

4读2写1执行。
rwx。