• shell总结


    shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。

    shell还是一个功能强大的编程语言,易编写,易调试,灵活性强。

    Shell解析器有:

    /bin/sh

    /bin/bash

    /bin/dash

    /bin/tcsh

    /bin/csh

     Shell中的变量

    1. 常用系统变量

     

    $HOME$PWD$SHELL$USER

    2. 自定义变量

    1.基本语法

    1)定义变量:变量= 

    2)撤销变量:unset 变量

    3)声明静态变量:readonly变量,注意:不能unset

    2.变量定义规则

    1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

    2)等号两侧不能有空格

    3bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

    4)变量的值如果有空格,需要使用双引号或单引号括起来。

    3.案例实操

    1)定义变量A

    [jinghnag@hadoop101 datas]$ A=5

    [jinghnag@hadoop101 datas]$ echo $A

    5

    2变量A重新赋值

    [jinghnag@hadoop101 datas]$ A=8

    [jinghnag@hadoop101 datas]$ echo $A

    8

    3)撤销变量A

    [jinghnag@hadoop101 datas]$ unset A

    [jinghnag@hadoop101 datas]$ echo $A

    4)声明静态的变量B=2,不能unset

    [jinghnag@hadoop101 datas]$ readonly B=2

    [jinghnag@hadoop101 datas]$ echo $B

    2

    [jinghnag@hadoop101 datas]$ B=9

    -bash: B: readonly variable

    5bash中,变量默认类型都是字符串类型,无法直接进行数值运算

    [jinghnag@hadoop101 ~]$ C=1+2

    [jinghnag@hadoop101 ~]$ echo $C

    1+2

    6变量的值如果有空格,需要使用双引号或单引号括起来

    [jinghnag@hadoop101 ~]$ D=I love banzhang

    -bash: world: command not found

    [jinghnag@hadoop101 ~]$ D="I love banzhang"

    [jinghnag@hadoop101 ~]$ echo $A

    I love banzhang

    7)可把变量提升为全局环境变量,可供其他Shell程序使用

    export 变量名

    [jinghnag@hadoop101 datas]$ vim helloworld.sh

     

    在helloworld.sh文件中增加echo $B

    #!/bin/bash

     

    echo "helloworld"

    echo $B

     

    [jinghnag@hadoop101 datas]$ ./helloworld.sh

    Helloworld

    发现并没有打印输出变量B的值

    [jinghnag@hadoop101 datas]$ export B

    [jinghnag@hadoop101 datas]$ ./helloworld.sh

    helloworld

    2

    3 特殊变量$n

     

    $n (功能描述:n为数字,$0代表该脚本名称$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}

    1)输出该脚本文件名称输入参数1和输入参数2 的

    [jinghnag@hadoop101 datas]$ touch parameter.sh

    [jinghnag@hadoop101 datas]$ vim parameter.sh

     

    #!/bin/bash

    echo "$0  $1   $2"

     

    [jinghnag@hadoop101 datas]$ chmod 777 parameter.sh

     

    [jinghnag@hadoop101 datas]$ ./parameter.sh cls  xz

    ./parameter.sh  cls   xz

    $# (功能描述:获取所有输入参数个数,常用于循环

    [jinghnag@hadoop101 datas]$ vim parameter.sh

     

    #!/bin/bash

    echo "$0  $1   $2"

    echo $#

     

    [jinghnag@hadoop101 datas]$ chmod 777 parameter.sh

     

    [jinghnag@hadoop101 datas]$ ./parameter.sh cls  xz

    parameter.sh cls xz

    2

    $* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

    $@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

    打印输入所有参数

    [jinghnag@hadoop101 datas]$ vim parameter.sh

     

    #!/bin/bash

    echo "$0  $1   $2"

    echo $#

    echo $*

    echo $@

     

    [jinghnag@hadoop101 datas]$ bash parameter.sh 1 2 3

    parameter.sh  1   2

    3

    1 2 3

    1 2 3

    $ (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

    判断helloworld.sh脚本是否正确执行

    [jinghnag@hadoop101 datas]$ ./helloworld.sh

    hello world

    [jinghnag@hadoop101 datas]$ echo $?

    0

    运算符

    1.基本语法

    1“$((运算式))”“$[运算式]”  + , - , *,  /,  %    加,乘,除,取余

    2expr  + , - , *,  /,  %    ,乘,除,取余

    注意:expr运算符间要有空格

    2.案例实操:

    (1)计算3+2的值

    [jinghnag@hadoop101 datas]$ expr 2 + 3

    5

    (2)计算3-2的值

    [jinghnag@hadoop101 datas]$ expr 3 - 2

    1

    (3)计算(2+3X4的值

    aexpr一步完成计算

    [jinghnag@hadoop101 datas]$ expr `expr 2 + 3` * 4

    20

    b)采用$[运算式]方式

    [jinghnag@hadoop101 datas]# S=$[(2+3)*4]

    [jinghnag@hadoop101 datas]# echo $S

    条件判断

    1.基本语法

    [ condition ]注意condition前后要有空格

    注意:条件非空即为true[ jinghnag ]返回true[] 返回false

    2. 常用判断条件

    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)

    3.案例实操

    123是否大于等于22

    [jinghnag@hadoop101 datas]$ [ 23 -ge 22 ]

    [jinghnag@hadoop101 datas]$ echo $?

    0

    2helloworld.sh是否具有写权限

    [jinghnag@hadoop101 datas]$ [ -w helloworld.sh ]

    [jinghnag@hadoop101 datas]$ echo $?

    0

    3/home/jinghnag/cls.txt目录中的文件是否存在

    [jinghnag@hadoop101 datas]$ [ -e /home/jinghnag/cls.txt ]

    [jinghnag@hadoop101 datas]$ echo $?

    1

    (4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令

    [jinghnag@hadoop101 ~]$ [ condition ] && echo OK || echo notok

    OK

    [jinghnag@hadoop101 datas]$ [ condition ] && [ ] || echo notok

    notok

    流程控制

    if 判断

    1.基本语法

    if [ 条件判断式 ];then

      程序

    fi

    或者

    if [ 条件判断式 ]

      then

        程序

    elif [ 条件判断式 ]

    then

    程序

    else

    程序

    fi

    注意事项:

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

    2if后要有空格

    2.案例实操

    1)输入一个数字如果1则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。

    [jinghnag@hadoop101 datas]$ touch if.sh

    [jinghnag@hadoop101 datas]$ vim if.sh

     

    #!/bin/bash

     

    if [ $1 -eq "1" ]

    then

            echo "banzhang zhen shuai"

    elif [ $1 -eq "2" ]

    then

            echo "cls zhen mei"

    fi

     

    [jinghnag@hadoop101 datas]$ chmod 777 if.sh

    [jinghnag@hadoop101 datas]$ ./if.sh 1

    banzhang zhen shuai

    case 语句

    1.基本语法

    case $变量名 in

      "1"

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

        ;;

      "2"

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

        ;;

      …省略其他分支

      *

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

        ;;

    esac

    注意事项:

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

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

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

    2.案例实操

    1)输入一个数字如果1,则输出banzhang,如果是2,则输出cls,如果是其它输出renyao

    [jinghnag@hadoop101 datas]$ touch case.sh

    [jinghnag@hadoop101 datas]$ vim case.sh

     

    !/bin/bash

     

    case $1 in

    "1")

            echo "banzhang"

    ;;

     

    "2")

            echo "cls"

    ;;

    *)

            echo "renyao"

    ;;

    esac

     

    [jinghnag@hadoop101 datas]$ chmod 777 case.sh

    [jinghnag@hadoop101 datas]$ ./case.sh 1

    1

     for 循环

    1.基本语法1

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

      do

        程序

      done

    2.案例实操

    1)从1加到100

    [jinghnag@hadoop101 datas]$ touch for1.sh

    [jinghnag@hadoop101 datas]$ vim for1.sh

     

    #!/bin/bash

     

    s=0

    for((i=0;i<=100;i++))

    do

            s=$[$s+$i]

    done

    echo $s

     

    [jinghnag@hadoop101 datas]$ chmod 777 for1.sh

    [jinghnag@hadoop101 datas]$ ./for1.sh

    “5050”

    3.基本语法2

    for 变量 in 1 2 3…

      do

        程序

      done

    4.案例实操

    1)打印所有输入参数

    [jinghnag@hadoop101 datas]$ touch for2.sh

    [jinghnag@hadoop101 datas]$ vim for2.sh

     

    #!/bin/bash

    #打印数字

     

    for i in $*

        do

          echo "ban zhang love $i "

        done

     

    [jinghnag@hadoop101 datas]$ chmod 777 for2.sh

    [jinghnag@hadoop101 datas]$ bash for2.sh cls xz bd

    ban zhang love cls

    ban zhang love xz

    ban zhang love bd

    while 循环

    1.基本语法

    while [ 条件判断式 ]

      do

        程序

      done

    2.案例实操

    1)从1加到100

    [jinghnag@hadoop101 datas]$ touch while.sh

    [jinghnag@hadoop101 datas]$ vim while.sh

     

    #!/bin/bash

    s=0

    i=1

    while [ $i -le 100 ]

    do

            s=$[$s+$i]

            i=$[$i+1]

    done

     

    echo $s

     

    [jinghnag@hadoop101 datas]$ chmod 777 while.sh

    [jinghnag@hadoop101 datas]$ ./while.sh

    5050

     Shell工具

    cut的工作就是,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

    1.基本用法

    cut [选项参数]  filename

    说明:默认分隔符是制表符

    2.选项参数说明

     

    选项参数

    功能

    -f

    列号,提取第几列

    -d

    分隔符,按照指定分隔符分割列

    -c

    指定具体的字符

    ed是一种编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

    1. 基本用法

    sed [选项参数]  ‘command’  filename

    1. 选项参数说

     

    选项参数

    功能

    -e

    直接在指令列模式上进行sed的动作编辑。

    -i

    直接编辑文件

    1. 命令功能描述

     

    命令

    功能描述

    a 

    新增,a的后面可以接字串,在下一行出现

    d

    删除

    s

    查找并替换 

    awk

    一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

    1. 基本用法

    awk [选项参数] ‘pattern1{action1}  pattern2{action2}...filename

    pattern:表示AWK在数据中查找的内容,就是匹配模式

    action:在找到匹配内容时所执行的一系列命令

    1. 选项参数说

     

    选项参数

    功能

    -F

    指定输入文件折分隔符

    -v

    赋值一个用户定义变量

    sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

    1. 基本语法

    sort(选项)(参数)

     

    选项

    说明

    -n

    依照数值的大小排序

    -r

    以相反的顺序来排序

    -t

    设置排序时所用的分隔字符

    -k

    指定需要排序的列

    参数:指定待排序的文件列表

    shell脚本

    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[@]}

    shell面试题

    百度脚本面试题

    1)写脚本实现,可以用shell、perl等。在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。
    参考答案1:
    [plain] view plaincopy
     
     
    1. #!/bin/sh  
    2. for filename in `find /tmp -type f -name "abc*"|head -n 100`  
    3. do  
    4. sed -n '1p' $filename>>new  
    5. done  
    解析:第一,用到了find命令,其中-type f表示选取普通文件,-name用于设定文件名;第二,head -n 100命令用于取出前100项。第三,sed -n ’1p’用于取出文件的第一行内容。第四,>>new表示追加到文件new中。
    参考答案2:
    [plain] view plaincopy
     
     
    1. find /tmp -type f -name “abc*” | head -n 100 | xargs head -q -n 1 >> new  
    2)写脚本实现,可以用shell、perl等。把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。 

    参考答案:
    [plain] view plaincopy
     
     
    1. grep -vxFf a b | tee c | wc -l  
    解析:grep选取-v表示不选择匹配的行,-F表示匹配的模式按行分割,-f a表示匹配模式来自文件a,最后表示目标文件b。即grep命令从b中选取a中不存在的行。
                tee c命令创建文件c,wc -l命令统计行数。
     
     
    1、 用sed修改test.txt的23行test为tset;     
    sed –i „23s/test/tset/g‟ test.txt

    2、 查看/web.log第25行第三列的内容。
    sed –n ‘25p’ /web.log | cut –d “ ” –f3
    head –n25 /web.log | tail –n1 | cut –d “ ” –f3
    awk –F “ ” ‘NR==23{print $3}’ /web.log


    3、 删除每个临时文件的最初三行。
    sed –i ‘1,3d’ /tmp/*.tmp


    4、 脚本编程:求100内的质数。
    #!/bin/bash
    i=1
    while [ $i -le 100 ];do
    ret=1
    for (( j=2;j<$i;j++ ));do
    if [ $(($i%$j)) -eq 0 ];then
    ret=0
    break
    fi
    done
    if [ $ret -eq 1 ];then
    echo -n "$i "
    fi
    i=$(( i+1 ))
    done


    5、 晚上11点到早上8点之间每两个小时查看一次系统日期与时间,写出具体配置命令
    echo 1 23,1-8/2 * * * root /tmp/walldate.sh >> /etc/crontab


    6、 编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
    #!/bin/bash
    fileinfo=($(du ./*))
    length=${#fileinfo[@]}
    for((i=0;i<$length;i=$(( i+2 ))));do
    if [ ${fileinfo[$i]} -le 10 ];then
    mv ${fileinfo[$(( i+1 ))]} /tmp
    fi
    done


    7、 如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1
    /sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.2.1:8080
    /sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080


    8、 在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh 怎么实现
    echo "1 6-12/2 * * * root /usr/bin/httpd.sh >> /etc/crontab"


    9、 在shell环境如何杀死一个进程?
    ps aux | grep | cut -f? 得到pid
    cat /proc/pid
    kill pid


    10、 在shell环境如何查找一个文件?
    find / -name abc.txt


    11、 在shell里如何新建一个文件?
    touch ~/newfile.txt

  • 相关阅读:
    2019杭电多校第二场hdu6601 Keen On Everything But Triangle(主席树)
    洛谷P3812 【模板】线性基
    2019牛客多校第二场D-Kth Minimum Clique(优先队列+bitset)
    2019牛客多校第二场H-Second Large Rectangle(单调栈)
    2019杭电多校第一场hdu6581 Vacation(贪心)
    2019牛客多校第二场F-Partition problem(搜索+剪枝)
    2019牛客多校第一场 E-ABBA(dp)
    实验9:Problem H: 薪酬计算
    实验9:Problem G: 克隆人来了!
    实验9:Problem F: 我们来做个Student类吧!
  • 原文地址:https://www.cnblogs.com/lu0420-0412/p/12320951.html
Copyright © 2020-2023  润新知