一句话来概括shell
    shell是一个基于Linux内核和应用程序之间的一个解释器

Shell解释器
    /bin/sh
    /bin/bash  目前多用的是bash
    /sbin/nologin
    /bin/dash
    /bin/tcsh
    /bin/csh

Shell的编程语言:
    编写第一个shell脚本
        1.删除class21下的test文件夹
        2.在class21新建一个文件夹test2,在test2中创建3个子文件夹dir1,dir2,dir3
        3.在dir2中新建一个文件student.txt
        4.在student.txt中添加一个zhangsan
        5.打印“任务执行完毕,2019-12-14 09:32:00”
            #!/bin/env bash
            :<<EOF
            多行注释
            jbckaslsjbcjk
            EOF

:<<!
            多行注释
            asbc
            !
            #1.删除class21下的test文件夹
            rm -rf /root/shell_class21/test
            #2.在class21新建一个文件夹test2,在test2中创建3个子文件夹dir1,dir2,dir3
            mkdir -p /root/shell_class21/test2/dir{1..3}
            #3.在dir2中新建一个文件student.txt
            cd /root/shell_class21/test2/dir2
            touch student.txt
            #4.在student.txt中添加一个zhangsan
            echo "张三" >> student.txt
            #5.打印“任务执行完毕,2019-12-14 09:32:00”
            echo "任务执行完毕 `date "+%Y-%m-%d %H:%M:%S"`"
            
            
            编写脚本:
                1.#!/bin/env bash 或者 #!/bin/bash
                2.添加脚本的描述信息(姓名、描述、路径、创建日期、更新日期等)
                3.开始写脚本
            
            执行脚本:
                bash + 相对路径
                bash + 绝对路径
                sh + 相对路径
                sh + 绝对路径
                source + 绝对路径
            
                推荐的执行方式:(相对路径、绝对路径执行)
                    1.为脚本添加可执行的权限
                        chmod +x 脚本名称.sh
                    2.相对路径(在脚本所在的文件夹下)
                        ./脚本名称.sh
                    3.绝对路径执行
                        /root/class21/脚本名称.sh
                    注意:
                        脚本中的第一行,指明解释器,一定不要写错
                        
            扩展命令
            bash -n 脚本名称.sh  #查找脚本的语法错误
            bash -x 脚本名称.sh  #查看脚本的执行过程
 变量
 1.系统变量
 2.自定义变量
    int a = 1;
    shell中的变量
        a=1 #注意变量等号左右两边不要出现空格;变量名不要包含特殊字符;变量名称不能以数字开头
            #作用域:只针对当前用户和当前会话有效
            
        echo $a  或者 echo ${a}  #读取变量
        
        export b=2  #(全局环境变量)作用域:只针对当前会话的所有用户有效
        
        创建系统的环境变量(作用域:只针对所有会话的所有用户有效)
            1.vim /etc/profile
            2.创建变量
                export 变量名(大写)=变量的值
            3.激活
                source /etc/profile
            
        取消变量
            unset a
        
        创建只读变量
            readonly 变量名=值
            
        
        特殊变量 $n、$#、$*、$@、$?
        #!/bin/bash
        echo $0 $1 $2 $3 ${11}
        
        echo $0 $1 $2 $3 ${11}
        echo $#
        echo $*
        echo $@
        
        for i in "$*"
        do
                echo $i
        done
        
        for i in "$@"
        do
                echo $i
        done

echo $? 返回结果0:表示成功 1:表示失败
        
==============================数组======================================
java
    String[] fileds={"1","2",.....}
    
    for(int i=0;i<fileds.lenght;i++){
        sout(fileds[i])
    }

shell
     创建空数据
     arr1=()
     创建非空数据(元素以空格分割)
     arr1=(1 2 3 4 5)
    
     根据索引给数组赋值
     arr[1]=元素值
    
     获取数组中的某个元素
     ${arr1[1]}
     获取数组中的所有元素
     ${arr1[*]}  ${arr1[@]}
     获取数组的长度
     ${#arr1[*]}  ${#arr1[@]}
    
    arr1=(a b c d e "hello word")
    for i in ${arr1[@]}
    do
            echo $i
    done
    
==========================运算===========================
 + , - , *,  /,  %    加,减,乘,除,取余
echo $(($b+$a)) <=>  echo $[$b+$a]
echo $[(2+3)*4]

+ , - , \*,  /,  %    加,减,乘,除,取余
expr $b + $a
expr `expr 2 + 3 ` \* 4

小数之间的运算(scale 小数点后几位,只对除法有效)
echo $(echo "scale=1; $c*$b" | bc)

==========================条件判断====================

2. 常用判断条件
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than)            -le 小于等于(less equal)
-eq 等于(equal)                -gt 大于(greater than)
-ge 大于等于(greater equal)    -ne 不等于(Not equal)

a=3
b=4
例如:[ $a -lt $b ]

(2)按照文件权限进行判断
-r 有读的权限(read)            -w 有写的权限(write)
-x 有执行的权限(execute)
例如:[ -x 文件名 ]

(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence)        -d 文件存在并是一个目录(directory)
例如:[ -e 文件名 ]

if 流程控制语句
java
if
    int a=3;
    if(a==3){
        sout(...)
    }else if{
        sout(...)
    }
    else{
        sout(...)
    }
    
shell

如果aaa.txt文件存在,往文件中写入bbb,如果不存在,创建aaa.txt文件,往文件中写入bbb
    if [ -f aaa.txt ]
    then
            echo "该文件存在"
            echo "bbb" >> aaa.txt
    else
            echo "该文件不存在"
            touch aaa.txt
            echo "bbb" >> aaa.txt
    fi

 if 判断

1.基本语法

if [ 条件判断式 ];then

程序

fi

或者

if [ 条件判断式 ]

then

程序

elif [ 条件判断式 ]

then

程序

else

程序

fi

注意事项:

(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格

(2)if后要有空格

if [ 条件判断式 ];then
          程序
     fi
    或者
    if [ 条件判断式 ]
      then
        程序
    elif [ 条件判断式 ]
        then
            程序
    else
        程序
    fi
    
    注意:if和elif后需要有空格

 case 语句

1.基本语法

case $变量名 in

"值1")

如果变量的值等于值1,则执行程序1

;;

"值2")

如果变量的值等于值2,则执行程序2

;;

…省略其他分支…

*)

如果变量的值都不是以上的值,则执行此程序

;;

esac

注意事项:

1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

2) 双分号“;;”表示命令序列结束,相当于java中的break。

最后的“*)”表示默认模式,相当于java中的default。

case流程控制语句
java:
    int a=111;
    switch(a){
        case 111:
            sout(...);
            break;
        case 222:
            sout(...);
            break;
        default:
            sout(...);
            break;
    }
    
shell
    
    使用case判断输入内容,如果输入1,输出aaa,如果输入2,输出bbb,如果输入其他,输出ccc
    case $1 in
        "1")
        echo "aaa"
        ;;
        "2")
        echo "bbb"
        ;;
        *)
        echo "ccc"
        ;;
    esac
    
    注意:case 相当于java中的switch
           "1") 相当于switch 中的 case "1":
           *) 相当于switch 中的default
           ;; 相当于switch 相当于break
           结尾 esac

 for 循环

1.基本语法1

for (( 初始值;循环控制条件;变量变化 ))

do

程序

done

for循环语句       
for 计算1到100之间所有偶数的和
    #!/bin/bash
    :<<!
    计算1到100之间所有偶数的和
    !

sum=0
    for((i=1;i<=100;i++))
    do
            if [  $(($i%2)) -eq 0 ]
            then
                    sum=$[$sum+$i]
            fi
    done
    echo "计算完毕$sum"

while循环语句
while
    i=1
    sum=0
    while [ $i -le 100 ]
    do
            if [  $(($i%2)) -eq 0 ]
            then
                    sum=$[$sum+$i]
            fi
            i=$[$i+1]
    done
    echo $sum
    
    注意:while后边有空格

read

1.基本语法

read(选项)(参数)

选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)。

参数

变量:指定读取值的变量名

read:
    read -t 5 -p "请在5秒之内输入要计算的数字(偶数)的和" NUM
    echo $NUM
    //判断事否输入了变量
    if [ ! -n "$NUM" ]
    then
            echo "用户没有输入数字"
            exit;
    fi

系统函数basename、dirname
[root@jinghang01 shell_class21]# basename /root/shell_class21/shell08_while.sh
shell08_while.sh
[root@jinghang01 shell_class21]# basename /root/shell_class21/shell08_while.sh .sh
shell08_while
[root@jinghang01 shell_class21]# dirname /root/shell_class21/shell08_while.sh
/root/shell_class21

自定义函数
    一种是带参数
        function 函数名(){
            s=0
            s=$[$1+$2]
            echo $s
        }
        
        调用
        函数名 $1 $2

一种是不带参数
        function 函数名(){
            s=0
            s=$[1+2]
            echo $s
        }
        
        调用
        函数名

带返回值的函数,返回值只能是数子,并且数字只能再0~255之间,
        function aa() { echo "aaaaa"; return 2}
        调用
        aa
        通过执行echo $?可以获取返回值

作业练习:
1.写一个脚本输入任意数组或则数字例如 2 3 4 5 6 7 8 9,输出最大值、最小值、平均值
#!/bin/bash
min=$1
max=$1
sum=0
for i in "$@"
do
    if [ $min -gt $i ]
    then
        min=$i
    fi
    if [ $max -lt $i ]
    then
        max=$i
    fi
    sum=$[$sum+$i]
done
echo "最大值为" $max
echo "最小值为" $min
echo "平均值为" $[$sum/$#]
2.写一个脚本输入任意数组或则数字例如 2 4 3 5 9 7 8 6,按照从小到大排序后输出
#!/bin/bash
arr=()
i=0
for value in "$@"
do
        arr[$i]=$value
        i=$[$i+1]
done

echo ${arr[*]}

for ((i=0;i<${#arr[@]};i++))  
do
        for ((j=$i;j<${#arr[@]};j++))
        do
    tmpvalue=${arr[$i]}
        if [ ${arr[$j]} -lt $tmpvalue ]
    then
        arr[$i]=${arr[$j]}
        arr[$j]=$tmpvalue
    fi
    done
done

echo ${arr[@]}
3.完成/root/shell_test/文件夹下完成一个脚本
    1.判断aaa.txt文件是否存在,存在则往文件中写入bbb,如果不存在,创建aaa.txt文件,往文件中写入bbb
    2.每一分钟执行一次脚本
    
shell中文本处理工具
cut

[root@jinghang01 shell_class21]# cat if | grep Bcast
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 1
          inet addr
[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 1,2
          inet addr:192.168.1.100  Bcast
[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 2
192.168.1.100  Bcast
[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 2 | cut -d " " -f 1
192.168.1.100
[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 2 | cut -d " " -f 2

[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 2 | cut -d " " -f 3
Bcast
[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 2 | cut -d " " -f 1
192.168.1.100
[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 2 | cut -d " " -f 1 | cut -c 1-3
192
[root@jinghang01 shell_class21]# cat if | grep Bcast | cut -d : -f 2 | cut -d " " -f 1 | cut -c 1,3
12

sed

选项参数    功能
-e    直接在指令列模式上进行sed的动作编辑(一次执行多个操作时)。
-i    直接编辑文件

命令功能描述
命令    功能描述
a     新增,a的后面可以接字串,在下一行出现
d    删除
s    查找并替换

awk
    正则表达式
        . 匹配除了换行符之外的任意字符
        \d 匹配数字0-9   =>    [0-9]
        \D 匹配非数字    =>    [^0-9]
        \s 匹配空白字符(空格 \t \n ....)
        \S 匹配非空白字符
        \w 匹配单词字符([a-zA-Z0-9_])
        \W 匹配非单词字符
        ^ 匹配以...开头
        $ 匹配结尾

多字符匹配(贪婪匹配)
        .* 匹配*号前的字符任意次数      aaabbbccc   a*?
        .+ 匹配+号前的字符至少一次
        .? 匹配?号前的字符0~1次

多字符匹配(非贪婪匹配)
        .*?
        .+?
        .??

其他
         |
        () 分组
        命令:
        cat passwd | awk -F : '/^root/{print $1"-"$3}'
        结果:
        root-0
        
        cat passwd | awk -F : '/^root|^jinghang/{print $1"-"$3}'
        root-0
        jinghang-500
        
        cat passwd | awk -F : '/^root/{print $1"-"$3} /^jinghang/{print $1"-"$3}'
        root-0
        jinghang-500
        
        awk -F : 'BEGIN{sum=0}{sum+=1;print $1","sum}END{print sum}' passwd
        
        awk -F : '$3 > 100' passwd
        
        awk -v sum=0 -F : '{sum+=1;print $1","sum}END{print sum}' passwd
    
        awk内置变量的使用
        FILENAME    文件名
        NR    已读的记录数
        NF    浏览记录的域的个数(切割后,列的个数)
        
        awk -F : '{print "filename:"FILENAME",lines:"NR",colums:"NF}' passwd
        
        使用awk提取ip地址
        cat if | grep Bcast | awk -F : '{print $2}' | awk -F " " '{print $1}'
        
        获取文件空行的行号
        cat if | awk '/^$/{print NR}'
        
        获取文件空行的总行数
        cat if | awk '/^$/{print NR}' | wc -l
        
    sort
        -n    依照数值的大小排序
        -r    以相反的顺序来排序
        -t    设置排序时所用的分隔字符
        -k    指定需要排序的列
        
        sort -t : -k 3 -n passwd  升序
        
        sort -t : -k 3 -nr passwd 降序

晚上作业(允许百度)
1.判断/root/class21/inittab.txt文件是否大于100行,如果大于,则显示”inittab is a big file.”否者显示”inittab is a small file.”
line='wc -l /etc/inittab/cut -d'' -f1'
if [ $line -gt 100 ];
then
echo"/etc/inittab is a big file"
else
echo"/etc/inittab is a small file"
fi

2.写出一个脚本程序,给定一个文件,比如:/root/class21/inittab.txt a、判断这个文件中是否有空白行? b、如果有,则显示其空白行的总行数,否则显示没有空白行
#!/bin/bash
  #
 
  B=`grep -n "^[[:space:]]*$" /etc/inittab|wc -l`
  C=`grep -n "^[[:space:]]*$" /etc/inittab|cut -d: -f1`
 
  if[$B -eq 0];then
      echo"没有空白行"
  else
     echo"有空白行,空白行为$C行"

3.给定一个文件,如果是普通文件,就显示出来,如果是目录文件,也显示出来,否则就显示“无法识别”
 #!/bin/bash
      
      read -t 5 -p "请输入一个文件:" filename  //-t 等待时间
      echo  #默认用来换行
 
      if [-z $filename];then
          echo"eg./etc/fstab"
          exit 8
      fi
 
     if [-f $filename];then
         echo"$filename是一个普通文件"
         exit 0
     elif [-d $filename];then
        echo"$filename是一个目录文件"
         exit 0
     else
         echo"无法识别"
         exit 1
     fi

4.写一个脚本,给脚本传递3个参数 两个数字,一个运算符,根据运算符计算出结果,例如 2 3 -   2-3=1

5.使用脚本批量创建用户
#!/bin/bash
i=1
groupadd group1
while [ $i -le 30 ]
do
if [ $i -le 9 ] ; then
username=user0$i
else
username=user$i
fi
useradd $username
mkdir /home/$username
chown -R $username /home/$username
chgrp -R group1 /home/$username
i=$(($i+1))
done

shell 下的更多相关文章

  1. shell下批量重命名svn文件的方法

    shell下批量重命名svn文件的方法 目标: 将svn目录下所有文件重命名 , 原文件前缀为 ucc_ , 批量改为 xmd_ 用tree看下当前svn目录 ucc_1.c ucc_1.h ucc_ ...

  2. 【笔记】shell下的主要工具

    shell 下有很多工具是非常好的辅助. 一.自我精进的途径 1.help / --help :简要的帮助说明: help 是针对 shell 内建功能的帮助, gnu工具一般为 "程序名 ...

  3. shell下获取系统时间

    shell下获取系统时间的方法直接调用系统变量 获取今天时期:`date +%Y%m%d` 或 `date +%F` 或 $(date +%y%m%d) 获取昨天时期:`date -d yesterd ...

  4. linux BASH shell下设置字体及背景颜色

    BASH shell下设置字体及背景颜色 echo -e "\e[31mtest\e[41m" \e[30m 将字符的显示颜色改为黑色 \e[31m 将字符的显示颜色改为红色 \e ...

  5. fish shell 下gopath的设置问题

    GOPATH可以设置多个工程目录,linux下用冒号分隔(必须用冒号,fish shell的空格分割会出错),windows下用分号分隔,但是go get 只会下载pkg到第一个目录,但是编译的时候会 ...

  6. Bash Shell 下打开一个TCP / UDP SOCKET

    Bash Shell 下打开一个TCP / UDP SOCKET http://jingyan.baidu.com/article/636f38bb6166c3d6b84610d1.html

  7. 02、体验Spark shell下RDD编程

    02.体验Spark shell下RDD编程 1.Spark RDD介绍 RDD是Resilient Distributed Dataset,中文翻译是弹性分布式数据集.该类是Spark是核心类成员之 ...

  8. 转 【MySQL】常用拼接语句 shell 下执行mysql 命令

    [MySQL]常用拼接语句 前言:在MySQL中 CONCAT ()函数用于将多个字符串连接成一个字符串,利用此函数我们可以将原来一步无法得到的sql拼接出来,在工作中也许会方便很多,下面主要介绍下几 ...

  9. zookeeper的shell下操作

    zookeeper的shell下操作 进入%ZK_HOME%/bin 执行zkCli.sh [-server ip:port] #如不指定,则连接本机   创建: create [-s] [-e] p ...

  10. Linux shell 下简单的进度条实现

    Linux shell 下简单的进度条实现 [root@db145 ~]# cat print_process.sh function Proceess(){ spa='' i= ] do print ...

随机推荐

  1. 推荐一款好看的Hexo主题Ayer

    介绍 Ayer 是一个干净且优雅的Hexo主题,自带响应式,加载速度很快,该有的功能都有,可配置项也很多,非常适合作为你的博客主题,主题内还附送了6张精美的高清壁纸.欢迎使用和Star支持,如果你在使 ...

  2. 【漏洞预警】Redis 4.x/5.x 远程命令执行高危漏洞

    2019年7月09日,阿里云应急响应中心监测到有安全研究人员披露Redis 4.x/5.x 远程命令执行高危漏洞利用代码工具.针对未授权或弱口令的Redis服务,攻击者通过构造特定请求,成功利用漏洞可 ...

  3. 码农-->工程师

    微信公众号推送文章记录,侵删 一个猎人的比喻: 当土著拿到猎枪之后,他们射箭的技能退化严重,但因为食物更多了,厨艺有了长足的进展. 当你不再为一些问题担心之后,你就可以把注意力集中在另外一些问题上了. ...

  4. 复杂的POI导出Excel表格(多行表头、合并单元格)

    poi导出excel有两种方式: 第一种:从无到有的创建整个excel,通过HSSFWorkbook,HSSFSheet HSSFCell, 等对象一步一步的创建出工作簿,sheet,和单元格,并添加 ...

  5. mybatis报错: java.lang.IllegalArgumentException invalid comparison: java.util.Date and java.lang.String

    原因是在使用<if> 进行条件判断时, 将datetime类型的字段与 ' ' 进行了判断,导致的错误 解决, 只使用  <if test="createTime != n ...

  6. 对Windows桌面应用程序进行UI自动化测试

    题记:本文简述如何利用appium对Windows桌面应用程序进行UI自动化测试. 所谓UI自动化测试,就是模拟一个用户,对应用程序的UI进行操作,以完成特定场景的功能性集成测试. 要对Windows ...

  7. P3747 [六省联考2017]相逢是问候

    题意 如果对一个数操作\(k\)次,那么这个数会变成\(c^{c^{...^{a_i}}}\),其中\(c\)有\(k\)个. 根据P4139 上帝与集合的正确用法这道题,我们可以知道一个数不断变为自 ...

  8. 前端笔记之微信小程序(一)初识微信小程序&WXSS与CSS|WXML与HTML的差异&像素和DPR

    一.小程序概述 2017 年 1 月 9 日小程序正式上线,腾讯开放了个人开发者开发小程序,小程序从此就开始火爆,这一年,小程序狂揽 4 亿用户.1.7 亿的日常活跃,上线 58 万个.这是一个巨大的 ...

  9. 对numpy.meshgrid()理解

    一句话解释numpy.meshgrid()——生成网格点坐标矩阵.关键词:网格点,坐标矩阵 网格点是什么?坐标矩阵又是什么鬼?看个图就明白了: 图中,每个交叉点都是网格点,描述这些网格点的坐标的矩阵, ...

  10. QLineEdit限制数据类型——只能输入浮点型数

    前言 最近做了一个小的上位机,要通过串口来下发几个时间参数,为了防止误输入,产生不必要的麻烦,我把输入范围限制在0-680的浮点型数据,支持小数点后2位.学习了一下QLineEdit类是如何限制输入类 ...