美文网首页我爱编程
shell 知识梳理

shell 知识梳理

作者: viean | 来源:发表于2018-04-11 15:17 被阅读0次

    一.shell环境(shell解释器)
    1.Bourne Shell --- /usr/bin/sh 或 /bin/sh
    2.Bourne Again Shell --- /bin/bash 应用最多,大多数linux系统默认的Shell
    3.C Shell --- /usr/bin/csh
    4.K Shell --- /usr/bin/ksh
    在一个shell脚本第一行告诉系统解释此脚本应该用的解释程序;

    #!/bin/bash
    

    二.shell变量
    1.变量定义时不需要加$符合

    your_name="runoob.com"
    

    另一种给变量赋值的方法为:

    for file in `ls /etc`
    

    2.使用变量时需要加$号

    echo $your_name
    echo ${your_name}
    

    例:

    for skill in Ada Coffe Action Java; do
        echo "I am good at ${skill}Script"
    done
    

    3.只读变量

    #!/bin/bash
    myUrl="www.baidu.com"
    readonly myUrl
    myUrl="www.baidu2.com"
    

    会报read only错误
    4.删除变量

    unset myUrl
    

    三.shell字符串
    单引号的任何字符串都会原样输出;
    单引号中不能出现单引号(对单引号使用转义符后也不行);

    双引号里可以有变量;
    双引号里可以出现转义字符;

    your_name="viean"
    greeting="hello ${your_name}"
    获取字符串长度
    echo ${#your_name}  #输出5
    提取子字符串
    echo ${your_name:3:2}  #输出an
    查找子字符串
    str="runoob is a great company"
    expr index "$str" is  #输出8
    expr length "$str"    #输出字符串长度
    

    四.shell数组
    1.定义:
    数组名=(值1 值2 值3 值4 值5)

    array_name=(value0 value1 value2)  #不能有空格
    或
    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2
    

    2.读取

    echo ${array_name[0]}
    

    使用@符号可以获取数组中的所有元素

    echo ${array_name[@]}
    

    3.获取数组的长度
    取得数组元素的个数

    length=${#array_name[@]}
    or
    length=${#array_name[*]}
    

    取得数组第0个元素的长度

    length=${#array_name[0]}
    

    五.shell参数传递
    sh mybash.sh ABC 123 456

    0 执行的文件名,如上结果为:mybash.sh1 第一个参数,如上结果为:ABC
    # 传递到脚本的参数个数,如上结果为:3* 以一个单字符串显示所有向脚本传递的参数;
    @ 同*,但是使用时加引号,并在引号中返回每个参数;
    $$ 进程的ID号;
    ! 后台运行的最后一个进程的ID号- 显示shell使用的当前选项;set命令功能相同;
    $? 最后命令退出状态,0表示没有错误,其他任何值表明有错误;

    六.shell运算符
    1.算术运算符
    原生bash不支持简单数学运算,但可以通过 expr 和 awk 命令实现,expr最常见;

    val=`expr 2 + 2`  #+号两边必须要有空格!
    echo $val         #结果4
    val=`expr 2+2`  #+号两边没有空格!
    echo $val         #结果2+2
    
    a=10
    b=20
    echo `expr $a \* $b`  #结果200,注意需要\*
    echo `expr $a == $b ` #结果0
    echo `expr $a != $b ` #结果1
    echo `expr $b % $a `  #求余,返回0
    

    在 MAC 中 shell 的 expr 语法是:((表达式)),如:echo((2+2))

    2.关系运算符
    只支持数字,不支持字符串,除非字符串的值是数字;
    -eq : 检测是否相等;
    -ne : 不等于;
    -gt : 是否大于;
    -lt : 是否小于;
    -ge : 是否大于等于;
    -le : 是否小于等于;

    a=10
    b=20
    if [ $a -eq $b ]
    then
        echo "$a -eq $b : a等于b"
    else
        echo "$a -eq $b : a不等于b"
    fi
    

    3.布尔运算符
    ! : 非运算符
    -o : 或运算符
    -a : 与运算符

    #!/bin/bash
    a=10
    b=20
    if [ $a != $b ]
    then
        echo "$a != $b : a不等于b"
    else
        echo "$a != $b : a等于b"
    fi
    
    if [ $a -lt 100 -o $b -gt 150 ]
    then
        echo "$a -lt 100 -o $b -gt 150 : true"
    else
        echo "$a -lt 100 -o $b -gt 150 : false"
    fi
    
    if [ $a -lt 100 -a $b -gt 150 ]
    then
        echo "$a -lt 100 -a $b -gt 150 : true"
    else
        echo "$a -lt 100 -a $b -gt 150 : false"
    fi
    

    4.逻辑运算符
    && : 逻辑AND
    || : 逻辑OR

    #!/bin/bash
    a=10
    b=20
    if [[ $a -lt 100 || $b -gt 150 ]]     #注意需要为[[...]]
    then
        echo "$a -lt 100 -o $b -gt 150 : true"
    else
        echo "$a -lt 100 -o $b -gt 150 : false"
    fi
    if [[ $a -lt 100 && $b -gt 150 ]]
    then
        echo "$a -lt 100 -a $b -gt 150 : true"
    else
        echo "$a -lt 100 -a $b -gt 150 : false"
    fi
    

    5.字符串运算符
    = : 两个字符串是否相等
    != : 两个字符串是否不等
    -z : 字符串长度是否为0, 为0返回true
    -n : 字符串长度是否不为0, 不为0返回true
    str : 检测字符串是否为空,不为空返回true

    a="abc"
    b="def"
    c=""
    if [ $a = $b ]
    then
        echo "$a = $b : true"
    else
        echo "$a = $b : false"
    fi
    if [ $a != $b ]
    then
        echo "$a != $b : true"
    else
        echo "$a != $b : false"
    fi
    if [ -z $a ]
    then
        echo "-z $a : true"
    else
        echo "-z $a : false"
    fi
    if [ -n $a ]
    then
        echo "-n $a : true"
    else
        echo "-n $a : false"
    fi
    if [ $c ]
    then
        echo "$c : 为空,返回true"
    else
        echo "$c : 为空,返回false"
    fi
    

    6.文件测试运算符
    -b : 是否为块文件
    -c : 是否为字符设备文件
    -d : 是否为目录
    -f : 检测文件是否是普通文件(即不是目录,也不是设备文件)
    -g : 检测文件是否设置了SGID位
    -k : 检测文件是否设置了粘着位(Sticky Bit)
    -p : 检测文件是否是有名管道
    -u : 检测文件是否设置了SUID位
    -r : 检测文件是否可读
    -w : 检测文件是否可写
    -x : 检测文件是否可执行
    -s : 检测文件大小是否在于0
    -e : 检测文件是否存在

    file="/var/www/runoob/test.sh"
    if [ -e $file ]
    then
        echo "$file : 文件存在"
    else
        echo "$file : 文件不存在"
    fi
    

    七.echo 与 printf命令
    1.echo显示换行:

    echo -e "OK! \n new Line"  -e为开启转义
    echo -e "OK! \C" -e开启转义,\C不换行
    

    2.printf
    默认printf不像echo自动添加换行符;需要手动添加\n
    用法:

    printf format-string [arguments]

    %-10s : -表示左对齐,10s表示指定宽度为10的字符
    %-4.2f : 格式化为小数,其中.2指保留2位小数
    %d : 数值型

    printf "%-10s %-8s %-4s\n" 姓名 性别 体重KG
    printf "%-10s %-8s %-4s\n" 张三 男 60KG
    printf "%-10s %-8s %-4s\n" 李四四 男 90KG
    
    printf "%d %s\n"  100 abc
    printf "%d %s\n"   #没有参数是,%d默认为0; %s默认为null
    

    八.test命令
    用于检查某个条件是否成立

    num1=100
    num2=200
    if test $[num1] -eq $[num2]
    then
        echo "两个数相等"
    else
        echo "两个数不等"
    fi
    
    num1="ru1noob"
    num2="runoob"
    if test $num1 = $num2
    then
        echo '两个字符串相等!'
    else
        echo '两个字符串不相等!'
    fi
    
    if test -e ./notFile -o -e ./bash
    then
        echo '至少有一个文件存在!'
    else
        echo '两个文件都不存在'
    fi
    

    九.shell流程控制
    1.if语句

    if condition
    then
        command1
        command2
    else
        command3
    fi
    

    各分支中语句不能为空;

    写为一行时:
    if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

    2.循环
    2.1 for循环

    for var in a b c d ... z
    do
        command1
        command2
    done
    

    2.2 while语句

    while condition
    do
        command
    done
    
    int=1
    while(( $int<=5 ))
    do
        echo $int
        let "int++"
    done
    

    util循环与while循环相反,执行一系列命令直到条件为真时停止;

    2.3 case语句

    case 值 in
    模式1)
        command1
        command2
        ;;
    模式2)
       command3
       command4
       ;;
    esac
    
    echo '输入 1 到 4 之间的数字:'
    echo '你输入的数字为:'
    read aNum
    case $aNum in
        1|2)  echo '你选择了 1或2'
        ;;
        3)  echo '你选择了 3'
        ;;
        4)  echo '你选择了 4'
        ;;
        *)  echo '你没有输入 1 到 4 之间的数字'
        ;;
    esac
    

    break 跳出循环
    contine 结束本次循环,进行下次循环

    十.shell函数
    1.定义:

    [function] function_name [()]
    {
        action;
        [return int;]
    }
    

    说明:可以带function fun()定义,也可以func()定义,不带任何参数;
    参数返回只能是0-255的数值,如不return默认返回最后一条命令的运行结果;

    #!/bin/bash
    addFunc(){
        echo "第一个参数 $1"
        echo "第二个参数 $2"
        return $1
    }
    addFunc 100 200
    a=$(addFunc 100 200)
    echo $a
    

    结果:
    第一个参数 100
    第二个参数 200
    第一个参数 100 第二个参数 200

    十一.shell输入/输出重定向

    command > file 将输出重定向到文件
    command < file 将输入重定向到文件
    command >> file 将输出以追加的方式重定向到file
    n > file 将文件描述符为n的文件重定向到file
    n >& m 将输出文件m和n合并
    n <& m 将输入文件m和n合并

    注:文件描述符为0通常是标准输入STDIN;1是标准输出STDOUT; 2是标准错误输出STDERR

    wc -l users
           2 users
    wc -l < users
           2 
    

    command1 < infile > outfile #同时替换输入和输出,执行command1,从文件infile读取内容,然后将输出写入到outfile中
    command 2 > file #标准错误重定向到file
    command > file 2>&1 #如果希望将 stdout 和 stderr 合并后重定向到 file

    HERE DOCUMENT

    $ wc -l << EOF
        欢迎来到
        菜鸟教程
    EOF
    3
    

    /dev/null 为垃圾箱文件,不希望在输出在屏幕或者文件中时,用此项

    command1 > /dev/null
    command1 > /dev/null 2>&1     #屏蔽stdout和stderr
    

    十二.shell文件包含
    . filename #.与文件名中间有一空格

    source filename

    shell中没有多行注释,只有单选注释 #

    知识来源

    相关文章

      网友评论

        本文标题:shell 知识梳理

        本文链接:https://www.haomeiwen.com/subject/juzahftx.html