zoukankan      html  css  js  c++  java
  • shell总结

    shell

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

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

    Shell解析器有:

     /bin/sh

     /bin/bash

    /bin/dash

    /bin/tcsh

    /bin/csh

    bash

    bash shell是Bourne shell的一个免费版本,它是最早的Unix shell,包括许多附加的特点。Bash有可编辑的命令行,可以回查历史命令,支持tab键补齐以使用户避免输入长的文件名。

    csh

    C shell使用的是“类C”的语法,借鉴了Bourne shell的许多特点,只是内部shell命令集有所不同。

    ksh

    Korn shell的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh,即使不把它作为主shell,也应该在系统中安装它。

    tcsh

    TC shell是C shell的一个增强版本,与C shell完全兼容。

    zsh

    Z shell是Korn shell的一个增强版本,具备bash shell的许多特色。

    Shell中的变量
    JAVA中的变量:
    修饰符 类型 变量名称
    private string name="张三";

    1.系统变量
    $HOME、$PWD、$SHELL、$USER等
    2.自定义变量(shell中的变量没有明显的数据类型区分)
    普通变量
    定义变量:变量名=值 (注意:1.等号两边不要出现空格 2.变量名称不要有特殊字符 3.变量名称不能以数字和特殊字符开头)
    读取变量:echo $变量名
    撤销变量:unset 变量名
    静态变量(一旦创建,只可读): readonly 变量名=值

    变量的作用域(只在当前会话和当前用户下有效)

    全局环境变量(export)
    定义变量:export 变量名=值
    全局环境变量的作用域(只在当前会话下的所有用户有效)

    系统环境变量
    vim /etc/profile
    #系统环境变量
    export CLASS22=ljh
    一定要激活:source /etc/profile
    系统环境变量的作用域(针对于所有会话下的所有用户都有效)

    查看所有变量
    使用set命令

    特殊的变量
    #!/bin/bash

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

    $#:获取所有输入参数个数,常用于循环

    $*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
    $@:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
    $?:表示读取命令的直接结果状态,返回的变量值为0,说明执行成功,非0则失败
    EOF

    echo $0 $1 $2 ${11}

    echo "参数的个数为:" $#

    echo "$/*" $*
    echo "$/@" $@

    ==================================Shell中的数组
    JAVA中的数组:
    String[] fields={"a","b","c",....}

    Shell中的数组:
    数组名=(元素 元素 元素 元素 元素) 元素之间以空格分割,索引从0开始,自增
    arr=(1 2 3 4 5 6 7)
    根据索引读取数组元素:echo ${arr[0]}
    获取数据组的长度:echo ${#arr[*]} | echo ${#arr[@]}
    获取数组中所有的元素:echo ${arr[*]} | echo ${arr[@]}
    修改数组:
    (1)可以直接给变量重新赋值
    (2)可以根据所有修改数组例如:arr[1]=c

    for循环遍历数组
    #!/bin/bash
    myarray=(1 2 3 4 5 6 7 8 9)
    for i in ${myarray[@]}
    do
    echo $i
    done

    ================运算符
    JAVA中的运算:
    private int num1=6
    private int num2=3
    int result=num1/num2

    Shell中的运算:
    “$((运算式))”或“$[运算式]” + , - , *, /, % 加,减,乘,除,取余
    echo $(($A/$B)) | echo $[$A/$B]
    echo $(($A+$B)) | echo $[$A+$B]
    echo $(($A-$B)) | echo $[$A-$B]
    echo $(($A%$B)) | echo $[$A%$B]

    echo $[(3+5)*$A]

    expr + , - , *, /, % 加,减,乘,除,取余
    注意:expr运算符间要有空格
    expr $A * $B

    expr `expr 3 + 5 ` * $A

    小数运算格式
    echo $(echo "scale=1;5/2" | bc)

    ==========Shell中的条件判断
    JAVA中的条件判断
    private int num1=6
    private int num2=3
    if(num1>num2){
    sout(.....)
    }else{
    sout(.....)
    }
    Shell中的条件判断
    [ condition ](注意condition前后要有空格)
    注意:条件非空即为true,[ jinghang ]返回true,[] 返回false。

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

    [ $A -lt $B ] :比较变量A是否小于变量B

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

    [ -w test06.sh ] : 判断文件是否有可写权限

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

    [ -f test04.sh ] :判断文件是否存在,并且是一个常规文件

    多条件判断:多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
    [root@Linux2 class22_shell]# [ -e test100.sh ] || echo "FALSE"
    FALSE

    [root@Linux2 class22_shell]# [ -e test04.sh ] && echo "TRUE"
    TRUE

    Shell重中之重点(流程控制)
    JAVA if条件判断
    private int num1=6
    private int num2=3
    if(num1>num2){
    sout(.....)
    }else{
    sout(.....)
    }
    Shell中的条件判断
    if [ 条件判断式 ]
    then
    主体代码
    fi
    ------------------------
    if [ 条件判断式 ]
    then
    主体代码
    elif [条件判断式]
    then
    主体代码
    else
    主体代码
    fi
    ------------------------------
    if [ 条件判断式 ]
    then
    主体代码
    else
    主体代码
    fi

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

    完成一个脚本,传入一个文件的名称,如果改文件是一个常规文件
    (1)往这个常规文件中写入 bbbb
    (2)如果不是常规文件,打印该文件不是常规文件

    #!/bin/bash
    if [ -f $1 ]
    then
    echo bbbb >> $1
    else
    echo "这个文件不是一个常规文件"
    fi

    case

    1.基本语法

    case $变量名 in

      "1"

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

        ;;

      "2"

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

        ;;

      …省略其他分支

      *

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

        ;;

    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

    whlie循环

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

    面试题

    1. 如何在脚本中使用参数 ?
    第一个参数 : $1,第二个参数 :$2
    例子 : 脚本会复制文件(arg1) 到目标地址(arg2)
    ./copy.sh file1.txt /tmp/
    cat copy.sh
    #!/bin/bash
    cp $1 $2
    2. 如何计算传递进来的参数 ?
    $#
    3. 如何检查之前的命令是否运行成功?
    $?
    4. 如何获取文件的最后一行 ?
    tail -1
    5. 如何获取文件的第一行 ?
    head -1
    6. 如何获取一个文件每一行的第三个元素 ?
    awk'{print $3}'
    7. 假如文件中每行第一个元素是FIND,如何获取第二个元素
    awk'{ if ($1 == "FIND") print$2}'
    8. 如何调试 bash 脚本
    将 -xv 参数加到#!/bin/bash 后
    例子:
    #!/bin/bash –xv
    9. 举例如何写一个函数 ?
    function example {
    echo "Hello world!"
    }
    10. 如何向连接两个字符串 ?
    V1="Hello"
    V2="World"
    V3=${V1}${V2}
    echo $V3
    输出
    HelloWorld
    11. 如何进行两个整数相加 ?
    V1=1
    V2=2
    let V3=$V1+$V2
    echo $V3
    输出
    3
    12. 如何检查文件系统中是否存在某个文件 ?
    if [ -f /var/log/messages ]
    then
    echo "File exists"
    fi
    13. 写出 shell 脚本中所有循环语法 ?
    for 循环 :
    foriin$(ls);do
    echo item:$i
    done
    while 循环 :
    #!/bin/bash
    COUNTER=0
    while [ $COUNTER -lt 10 ]; do
    echo The counter is $COUNTER
    let COUNTER=COUNTER+1
    done
    until 循环 :
    #!/bin/bash
    COUNTER=20
    until [ $COUNTER -lt 10 ]; do
    echo COUNTER $COUNTER
    let COUNTER-=1
    done
    14. 每个脚本开始的#!/bin/sh 或 #!/bin/bash 表示什么意思?
    这一行说明要使用的 shell。#!/bin/bash表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python。
    15. 如何获取文本文件的第 10 行 ?
    head -10 file|tail -1
    16. bash 脚本文件的第一个符号是什么
    #
    17. 命令:[ -z"" ] && echo 0 || echo 1 的输出是什么
    0
    18. 如何在后台运行脚本 ?
    nohup command&
    19. "chmod 500 script" 做什么 ?
    使脚本所有者拥有可执行权限。
    20.  ">" 做什么 ?
    重定向输出流到文件或另一个流。
    21. & 和&& 有什么区别
    & - 希望脚本在后台运行的时候使用它
    && - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它
    22. bash shell 脚本中哪个符号用于注释 ?
    #
    23. ' 和 " 引号有什么区别 ?
    ' - 当我们不希望把变量转换为值的时候使用它。
    " - 会计算所有变量的值并用值代替。
    24. 如何在脚本文件中重定向标准输出和标准错误流到log.txt 文件 ?
    在脚本文件中添加 "exec >log.txt2>&1" 命令。
    25. 如何只用 echo 命令获取字符串变量的一部分 ?
    echo ${variable:x:y}
    x - 起始位置
    y - 长度
    例子:
    variable="My name is Petras, and I amdeveloper."
    echo ${variable:11:6} # 会显示 Petras


      

  • 相关阅读:
    STL 之 unordered_map
    vim tab和空格相互替换
    windows使用
    debugger打不开
    存储过程中执行动态Sql语句
    什么是详细设计说明书?
    C#中调用SQL存储过程(带输入输出参数的例子)
    如何解决网站在IE8下出现布局乱的情况?
    SQLServer 游标简介与使用说明
    线程池ThreadPoolExecutor参数设置
  • 原文地址:https://www.cnblogs.com/liqian-/p/12321339.html
Copyright © 2011-2022 走看看