shell编程

  • A+
所属分类:linux技术
摘要

  Shell 数组用括号来表示,元素用”空格”符号分割开,如果元素中包含空格,则该元素使用双引号引起来,例如”hello word”

一,介绍

什么是解释性语言?什么是编译型语言?
程序不需要编译,程序在运行时由解释器翻译成机器语言。每执行一次都要翻译一次因此效率比较低。
程序在执行前需要一个专门的编译过程,把程序编译成为假期语言文件,运行时不需要重新翻译,直接使用编译的结果。

二,脚本的作用

脚本的格式
#!/bin/bash
脚本的作用
1.自动化软件部署 2.自动化分析处理 3.自动化备份 4.自动化监控脚本

三,she怎末用

脚本运行方式
sh/bash 绝对路径|相对路径
chmod+x 脚本名称  ./脚本名称
在任意地方执行脚本 将脚本移动至bin目录  脚本名称

四,shell变量

定义用户变量
变量名=值
变量名=`执行命令`
变量名=$(执行命)
读取变量
echo ${A:2:3} 2下标 3往后截取的长度
echo ${A}
echo $A
作用域 只在当前会话的当前用户下有效

全局环境变量
export 变量名=值
作用域  针对于当前会话的所有用户有效
系统环境变量
需要在 vim /etc/profile 定义变量 export 变量名=值
变量生效 source /etc/profile
特殊变量
$n 语法:$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
$# 获取所有参数的个数
$* 获取所有参数 加“”会把参数看作一个整体
$@ 获取所有参数  加“”也是 把每个参数分区对待
$? 返回上一次执行命令的将结果 正确返回0 错误返回一
 
$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数;当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。
案例:
for i in "$@"
do
  echo $i
done
for i in "$*"
do
  echo $i
done
shell编程

 

 

五,shell数组

Shell 数组用括号来表示,元素用"空格"符号分割开,如果元素中包含空格,则该元素使用双引号引起来,例如"hello word"

语法:arr=(1 2 3 4 5 6 7 8)

赋值:可以创建时添加如上
          通过下标添加 arr[n]=_?_
读取:
echo ${arr[*]}  echo ${arr[@]} 获取数组中所有元素
echo ${arr[2]} 通过下表获取元素
echo ${#arr[*]}  echo ${#arr[@]} 获取数组的长度
unset arr[2] 通过下表删除数组的元素 并删除这这个下标

六,shell运算符

整数运算符 
$((运算式)) $[运算是] “+,-,*,/,%” 运算符间可以不要空格
echo $[(2*2)+4]
expr +,-,*,/,%, 运算是之间要有空格
 expr `expr 2 * 2` * 4
小数运算
bc:Linux下的一个计算器程序,可以处理整数和小数。Shell 本身只支持整数运算,想计
算小数就得使用 bc这个外部的计算器

语法:echo "scale=小数位数" ; 运算式" | bc
案例:
计算3*8/7 结果保留4位小数: echo "scale=4; 3*8/7" | bc
计算4/9,保留2位,结果赋值给ret变量   ret=$(echo "scale=2;4/9"|bc) echo $ret

七,shell条件判断

语法  []条件非空即true
[ condition ] (注意:condition前后要有空格)
(1)两个整数之间比较
   == 字符串比较
   -lt 小于(less than)   
   -le 小于等于(less equal)
   -eq 等于(equal)    
   -gt 大于(greater than)
   -ge 大于等于(greater equal) 
   -ne 不等于(Not equal)
(2)按照文件权限进行判断
   -r 有读的权限(read)   
   -w 有写的权限(write)
   -x 有执行的权限(execute)
(3)按照文件类型进行判断
  -f 文件存在并且是一个常规的文件(file)
  -e 文件存在(existence)  
  -d 文件存在并是一个目录(directory)
案例:
判断文件是否具有写权限
[jinghang@hadoop101 datas]$ [ -w helloworld.sh ]
[jinghang@hadoop101 datas]$ echo $?  代表上一条命令执行结果 正确返回0 错误返回1
0
判断目录中的文件是否存在
[jinghang@hadoop101 datas]$ [ -e /home/jinghang/cls.txt ]
[jinghang@hadoop101 datas]$ echo $?
1
多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,
|| 表示上一条命令执行失败后,才执行下一条命令)
[jinghang@hadoop101 ~]$ [ condition ] && echo OK || echo NOTOK
OK
[jinghang@hadoop101 ~]$ [ condition ] && [ ] || echo NOTOK
NOTOK

八,shell流程控制

(一),if 判断语句

语法1: if [ 条件判断式 ]
     then
     主体代码
     fi
语法2: if [ 条件判断式 ]
     then
     主体代码
     else                       
     主体代码
     fi
语法3: if [ 条件判断式 ]
     then
     主体代码
     elif [条件判断式]
     then
     主体代码
     else
     主体代码
     fi
注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须要有空格
                (2)if后要有空格
案例:
编写一个脚本,传入文件或者目录名称
(1)判断文件或者目录是否存在,存在则完成(2)(3)步骤,不存在则输出文件或目录不存在
(2)如果是文件输出路径并打印"该路径为文件路径",并往文件中写入 "你真好看"
(3)如果是目录,输出路径并打印"该路径为目录路径",并在该路径下创建bbb.txt文件

shell编程

 

 

(二),case 判断语句

语法
case $变量名 in
  "值1")
    如果变量的值等于值1,则执行程序1
    ;;
  "值2")
    如果变量的值等于值2,则执行程序2
    ;;
  …省略其他分支…
  *)
    如果变量的值都不是以上的值,则执行此程序
    ;;
esac
注意事项:
(1)case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
(2)双分号“;;”表示命令序列结束,相当于java中的break。
(3)最后的“*)”表示默认模式,相当于java中的default。

(三),for 循环语句

语法1:
for (( i=0;i<100;i++ ))
do
 程序
done
语法2:
    $*:读取传入脚本中的全部参数,把参数看作一个整体
    $@:读取传入脚本中的全部参数,把参数区分对待

 for  变量  in "$*"
 do
   程序
 done
 for  变量  in "$@"
 do
   程序
 done
案例:
从1加到100
#!/bin/bash
sum=0
for((i=0;i<=100;i++))
do
        sum=$[ sum+i ]
done
echo $sum
[jinghang@hadoop101 datas]$ chmod 777 for1.sh
[jinghang@hadoop101 datas]$ ./for1.sh
“5050”

(四),while 循环语句

语法
while [ 条件判断式 ] 注意 :while 和条件判断式 与[之间都要有空格
  do
    程序
  done

5.until 循环语句
until 循环执行一系列命令直至条件为 true 时停止
until [ 条件判断式 ]
do
    主题代码
done
案例:
#!/bin/bash
i=0
sum=0
until [ $i -eq 101 ]
do
    sum=$[sum+i]
    i=$[i+1]
done
echo $sum
echo $i

九,read读取控制台输入

语法
read [选项] [参数]
选项  功能
-p    指定读取值时的提示符
-t    指定读取值时等待的时间(秒)
参数:指定读取的值的变量名
案例:
1.使用read命令读取命令行输入参数,提示“Enter your name in 7 seconds”,
把用户输入参数赋值给NAME变量

shell编程

 

 

十,shell函数

(一),系统函数

basename
 basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来
 basename [string / pathname] [suffix]
  可选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
 案例:

shell编程

 

 

dirname
 从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
 dirname 文件绝对路径 
 案例

shell编程

 

 

(二),自定义函数

 语法:
  [ function ] funname()
        {
         Action;
         [return int;]
        }
        funname
 经验技巧
 (1)必须在调用函数地方之前,先声明函数,shell脚本逐行运行。不会先编译。
 (2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
 案例
  输入两个参数,计算两个参数的和

shell编程

 

 

补充:
用户函数定义在当前用户主目录下的.bashrc文件里在当前用户下所有的会话都有效
调用前要source一下
系统函数定义在/etc/profile文件下 对所有用户所有会话都有效
也要source一下

十一,shell文本处理

(一),cut

功能描述:cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的,cut指令用
户显示行中的指定部分,删除文件中的指定字段。
cut [选项] [文件]
选项   功能
-b    -b <起始字节位置-结束字节位置>仅显示行中指定字节范围的内容。例如,“-b
       2-10”将显示第2~10个字节位置的内容,当只有一个数字时,则仅显示指定字符
    位置的内容.
-f     <起始列位置-结束列位置>   显示指定的字段内容
-d     <分隔符>  指定字段的分隔符,默认的字段分隔符为“TAB”
-c     <起始字符位置-结束字符位置>   仅显示行中指定范围的字符。例如,
        “-c2-10” 将显示第2~10个字符位置的内容。当只有一个数字时,则仅显示指定
  字符位置的内容
案例:
(1)切割cut.txt第一列
 cut -d " " -f 1 cut.txt
(2)切割cut.txt第二、三列
 cut -d " " -f 2,3 cut.txt
(3)切割ifconfig 后打印的IP地址

shell编程

 

 

(二),sort

功能描述:它将文件进行排序,并将排序结果标准输出
语法:sort 【选项】【参数】
            选项    功能
          -n     依照数值的大小排序
         -r     以相反的顺序来排序
         -t     设置排序时所用的分隔字符
         -k     指定需要排序的列
         参数:是指待排序的文件
案例:如有以下数据

shell编程

 

 

按照整数排序:

shell编程

 

 

按照小数排序

shell编程

 

 

(三),正则表达式

 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为
 regex、regexp或RE)。正则表达式通常被用来检索、替换那些符合某个模式(规则)
 的文本单字符匹配
     d  匹配一个数字字符。等价于[0-9]
  D   匹配一个非数字字符。等价于[^0-9]
  w   匹配包括下划线的任何单词字符。类似但不等价于[A-Za-z0-9_]
  W  匹配任何非单词字符。等价于 [^A-Za-z0-9_]
  s   匹配空白字符,包括空格、制表符、换页符等等,等价于[ fnrtv]
  S   匹配任何可见字符。等价于[^ fnrtv]
  .点  匹配除“n”和"r"之外的任何单个字符
  [a-z]  字符范围,匹配a~z之间的任意字符
  [^a-z] 匹配除了a~z之间的其他字符
  n  匹配换行符
 多字符匹配
  +   匹配前面的子表达式一次或多次(大于等于1次)
  *   匹配前面的子表达式任意次
  ?  匹配前面的子表达式零次或一次
  {n}  n是一个非负整数。匹配确定的n次
  {n,m}  m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次
 其他
  ^  匹配输入字行首
  $  匹配输入行尾
  | 将两个匹配条件进行逻辑“或”(or)运算
  x|y  匹配x或y

(四),sed

 功能描述:sed是一种单行文本流式编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件结束。文件内容并没有改变,除非你使用重定向存储输出。
 语法:sed [选项]  ’命令‘   文件名
  选项    功能
  -e     直接在指令列模式上进行sed的动作编辑(一次执行多个操作时)。
  -i     直接编辑文件
  -n                   取消默认输出sed默认会输出所有文本内容,使用-n
                          参数后只显示处理过的行 
  
  命令    功能
  p     打印一般 -n 配合使用
  a      新增,在指定的行之后插入内容
  i       新增,在指定的行之前插入内容
  d     删除
  s     查找并替换 (注意:如果进行全局的查找替换 sed -i ‘s/查找条件/替换字符串/g’   global)
 案例:
  数据准备

shell编程

 

 

  (1)将“mei nv”这个单词插入到sed.txt第二行下,打印。

shell编程

 

 

  (2)删除sed.txt文件所有包含wo的行
  shell编程

 

 

  (3)将sed.txt文件中wo替换为ni
shell编程

 

 

    注意:‘g’表示global,全部替换
  (4)将sed.txt将wo替换为ni只打印处理后的行
 shell编程

 

 

  (5)批量添加注释

shell编程

 

 

  (6)批量取消注释
  shell编程

 

 

(五),awk

 功能描述:是一门编程语言,也是一个强大的文本分析工具,逐行扫描文件,
 默认从第一行到最后一行,寻找匹配特定模式的行,并在这些行上进行你想要
 的操作。
 
 语法:awk 选项  ‘pattern1{action1}  pattern2{action2}...’   文件名
  pattern:表示AWK在数据中查找的内容,就是匹配模式
        action:在找到匹配内容时所执行的一系列命令
  选项   功能
  -F    指定输入文件的分隔符
  -v    赋值一个用户定义变量
 案例1:
  passwd文件
  (1)搜索passwd文件以root关键字开头的所有行,并输出该行的第1列和第7列。
  shell编程

 

 

    注意:只有匹配了pattern的行才会执行action
      (2)搜索passwd文件以root和lisi关键字开头的所有行,并输出该行的第1列和第7列。
   shell编程

 

 

  (3)只显示/etc/passwd的第一列和第七列,,且在所有行前面添加列名user,shell在最后一行添加"总用户数:用户数量"。
  shell编程

 

 

    注意:BEGIN 在所有数据读取行之前执行;END 在所有数据执行之后执行。
  (4)将passwd文件中的用户id增加数值1并输出计算后的用户id和用户名

shell编程

 

 

  (5)切割IP
   shell编程

 

 

          (6)统计passwd文件用户id大于500的用户数,和统计id小于500的用户数

shell编程

 

 

 awk的内置变量

  变量    说明
  FILENAME  文件名
  NR     已读的记录数
  NF     浏览记录的域的个数(切割后,列的个数)
 案例2:
  (1)统计passwd文件名,每行的行号,每行的列数
   shell编程

 

 

  (2)查询sed.txt中空行所在的行号并统计行号总数
  shell编程