当前位置 博文首页 > Shell常见用法小记

    Shell常见用法小记

    作者:闻波 时间:2021-06-21 18:32

    shell的简单使用

    最近发现shell脚本在平常工作中简直算一把瑞士军刀,很多场景下用shell脚本能实现常用的简单需求,而之前都没怎么学习过shell,就趁机把shell相关的语法和常见用法总结了下,方便以后随时回顾和查阅!

    1. 综述

    shebang

    其实shell的开始并不难,第一行如下:

    #!/bin/bash

    叫做shebang

    注释

    shell的注释以#开头(这点类似于python)

    变量

    变量定义:

    var_test1="hello"

    注意定义和赋值时=两边均不能有空格,且变量名前不能加$!

    变量使用:

    echo $var_test1

    echo ${var_test1}

    或:

    str1="${var_test1} world"

    加上美元符后的变量会被替换为其值。注意,单引号中的不会被替换

    命令执行结果赋给一个变量:

    lines=`wc -l 1.txt` # 这里lines就被赋值为了1.txt的行数
    
    lines="$(wc -l 1.txt)" # 单撇号不能嵌套,可用这种包含在内
    

    格式化变量:

    echo 23 | awk {printf("%05d", $0);} # 00023

    字符串截取:

    ${var_test1:1:3}会得到"ell",即从索引1开始取3个字符

    输出

    shell中的输出直接用echo即可

    echo "hello word"

    等同于

    echo hello word

    输入:

    • echo "What's your name?"
    • read Name # 这里不需要声明新变量
    • echo Hello, $Name!

    多语句组合

    &&: 满足短路原则,即第一个命令返回失败时不会执行第二个命令

    ||: 满足短路原则,即第一个命令返回成功时不会执行第二个命令

    ;: 不短路,不管第一个命令是否返回成功,均会执行第二个命令

    echo "Always executed" || echo "Only executed if first command fails"
    echo "Always executed" && echo "Only executed if first command does NOT fail"
    echo "Always executed1" ; echo "Always executed2"

    通道和重定向

    cmd1 | cmd2: 通道,第一个命令的输出会直接作为第二个命令的标准输入来执行

    python test.py < in.txt: 输入重定向,将从in.txt读取输入而非标准输入流

    echo "hello" > out.txt: 输出重定向,将前一个命令的输出定向到文件out.txt中(创建新文件并写入)

    echo "hello" >> append.txt: 输出重定向,将前一个命令的输出定向到文件append.txt中(追加到文件末尾)

    echo "hello" 2> err.txt: 错误流重定向,将前一个命令的错误流输出定向到文件err.txt中(创建新文件并写入)

    echo "hello" 2>> err.txt: 错误流重定向,将前一个命令的错误流输出定向到文件err.txt中(追加到文件末尾)

    2. 判断

    最简单的判断逻辑是:

    if [ condition1 ]; then
       statement1
    elif [ condition2 ]; then
      statement2
    else
      statement3
    fi
    # 或者用test
    if test condition1 ; then
       statement1
    fi

    注意:condition两边与[]之间必须至少有一个空格

    判断条件

    shell中判断条件不同于其他语言中的<,>,==,<=,>=那么直接,常见的有下列几种:

    -eq  等于(==)
    -ne  不等于(!=)
    -gt  大于(\>)
    -lt  小于(\<)
    -le  小于等于
    -ge  大于等于
    -z  空串
    -n  非空串
    ==  两个字符相等
    !=  两个字符不等

    组合判断

    -a   且
    -o   或

    特殊用法[[ ... ]]

    字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]]结果为真
    &&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。比如可以直接使用if [[ $a != 1 && $a <= 5 ]],如果不使用双括号, 则为if [ $a -ne 1] && [ $a -le 5 ]或者if [ $a -ne 1 -a $a -le 5 ]

    文件的判断

    -f   判断后面是否为一个文件
    -d   判断后面是否为一个目录
    -e   判断后面对应的文件是否存在
    -s   判断文件是否存在且不为空

    switch case

    case "$Variable" in
      # 列出需要匹配的字符串
      0) echo "There is a zero.";;
      1) echo "There is a one.";;
      *) echo "It is not null.";;
    esac

    3. 循环

    for 循环

    # {1..3} == `seq 1 3`
    for Variable in {1..3}
    do
      echo "$Variable"
    done

    或传统的"for循环",但需要加两层括号(两层的小括号内可以写C语言中的语句):

    for ((a=1; a <= 3; a++))
    do
      echo $a
    done

    在其他命令的结果上执行for循环:

    for Output in $(ls)
    do
      cat "$Output"
    done

    while 循环

    while [ condition ]
    do
      echo "loop body here..."
      break
    done

    4. 命令行

    $#   命令行参数个数
    $0   当前脚本名
    $n   第n个参数值,n可取1,2,3...
    $@   所有命令行参数
    $?   上一个命令的返回值

    5. 其他常用命令

    # 打印每行中 ',' 之前内容
    cut -d ',' -f 1 file.txt
    # 将 file.txt 文件所有 'okay' 替换为 'great', (兼容正则表达式)
    sed -i 's/okay/great/g' file.txt
    # shell中不支持浮点数除法运算,可使用awk实现浮点除法
    a=3
    b=4
    c=`awk 'BEGIN{printf "%.2f",('$a'/'$b')}'` # 单引号内的变量不能被替换,因此需要将变量单独放在引号外

    本文简要介绍了下shell入门的一些用法,如有不对之处,欢迎大家指正。我也是不久前才开始真正使用shell,这是个强大而又复杂的语言,大家有比较好的shell资料也欢迎留言,共同学习,谢谢!

    js
    下一篇:没有了