• shell日常使用整理


    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/wzzfeitian/article/details/30995303

    基本常识

    1.变量命名规则:

    1. 首字符必须为字母
    2. 中间不能有空格,能够有下划线_
    3. 不能使用标点符号
    4. 不能使用bash里的keyword

    2.变量赋值

    变量名=值, (注意。= 两边不能有空格)

    var=1
    var=$var+1
    echo $var+1
    输出为1+1,而不是2
    
    能够用例如以下方法使其输出为2
    let "var+=1"
    #var=$[$var+1]
    #var=$(($var+1))
    echo $var
    或者
    var=1
    var= expr $var + 1 #(注意,+ 两边的空格,一定要有)
    
    let表示数学运算,expr用于整数值运算。每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。

    在bash中。将数学运算结果赋给某个变量。 var=$[ operation ] 变量自增,自减 let var++ let var-- let var+=2 echo "10.2-2" | bc -- 小数运算要用bc $[]不支持小数

    3.变量使用

    $var ${var} " " 中能够用$var ," ' ' 中不能够用$var " $(cmd) 与 `cmd` 等效

    内建变量

    • $RANDOM 随机数
    • 字段分隔符 IFS=$' '
    • $0 程序名 。$1 ... $9 是命令行參数 多于9个命令行參数的话,后面的须要${10} ${11}这样的格式
    • $# 表示传入的命令行參数的个数。在{}中使用$#时,要改用 ${!#}
    • $* 全部命令行參数当成一个单词存储
    • $@ 全部命令行參数当成一个字符串中的多个单词
    • $$ 脚本的PID

    条件变量替换

    Bash Shell能够进行变量的条件替换,既仅仅有某种条件发生时才进行替换,替换条件放在{}中.

    1. ${value:-word} 当变量没有定义或者值为空时,返回值为word的内容,否则返回变量的值.
    2. ${value:=word} 与前者相似,仅仅是若变量没有定义或者值为空时,在返回word的值的同一时候将 word赋值给value
    3. ${value:?

      message} 若变量已赋值的话,正常替换.否则将消息message送到标准错误输出若此替换出如今Shell程序中,那么该程序将终止执行.

    4. ${value:+word} 若变量已赋值的话,其值才用word替换,否则不进行不论什么替换
    5. ${value:offset} ${value:offset:length} 从变量中提取子串,这里offset和length能够是算术表达式.
    6. ${#value} 变量的字符个数
    7. ${value#pattern} ${value##pattern} 去掉value中与pattern相匹配的部分,条件是value的开头与pattern相匹配 #与##的差别在于一个是最短匹配模式,一个是最长匹配模式.
    8. ${value%pattern} ${value%%pattern} 与7.相似,仅仅是是从value的尾部于pattern相匹配,%与%%的差别与#与##一样
    9. ${value/pattern/string} ${value//pattern/string} 进行变量内容的替换,把与pattern匹配的部分替换为string的内容,/与//的差别与上同 注意: 上述条件变量替换中,除2.外,其余均不影响变量本身的值

    4.比較运算符

    • 文件比較运算符
    -e filename                假设 filename 存在,则为真               [ -e /var/log/syslog ]
    -d filename                假设 filename 为文件夹。则为真             [ -d /tmp/mydir ]
    -f filename                假设 filename 为常规文件,则为真          [ -f /usr/bin/grep ]
    -L filename                假设 filename 为符号链接,则为真          [ -L /usr/bin/grep ]
    -r filename                假设 filename 可读,则为真               [ -r /var/log/syslog ]
    -w filename                假设 filename 可写。则为真               [ -w /var/mytmp.txt ]
    -x filename                假设 filename 可执行。则为真             [ -L /usr/bin/grep ]
    filename1 -nt filename2    假设 filename1 比 filename2 新。则为真   [ /tmp/install/etc/services -nt /etc/services ]
    filename1 -ot filename2    假设 filename1 比 filename2 旧。则为真   [ /boot/bzImage -ot arch/i386/boot/bzImage ]
    
    • 字符串比較运算符 (请注意引號的使用,这是防止空格扰乱代码的好方法)
    -z string               假设 string 长度为零,则为真            [ -z "$myvar" ]
    -n string               假设 string 长度非零,则为真            [ -n "$myvar" ]
    string1 = string2       假设 string1 与 string2 同样,则为真    [ "$myvar" = "one two three" ]
    string1 != string2      假设 string1 与 string2 不同。则为真    [ "$myvar" != "one two three" ]
    
    • 算术比較运算符
      num1 -eq num2       等于            [ 3 -eq $mynum ]
      num1 -ne num2       不等于          [ 3 -ne $mynum ]
      num1 -lt num2       小于            [ 3 -lt $mynum ]
      num1 -le num2       小于或等于      [ 3 -le $mynum ]
      num1 -gt num2       大于            [ 3 -gt $mynum ]
      num1 -ge num2       大于或等于      [ 3 -ge $mynum ]
      

    5.结构语句

    if command
    then
        commands
    fi
    
    if command; then  #假设then与if在同一行,if command后要加';'
         commands
    fi
    
    if command
    then
         commands
    else
         commands
    fi
    
    if command1
    then
         commands
    elif command2
    then
         commands
    fi
    
    if test condition
    if [ condition ] 注意[]与condition之间的空格。> < 须要转义
    then
         commands
    fi
    
    if ((expression)) > < 不须要转义
    then
         commands
    fi
    
    if [[condition]]  能够用正則表達式
    then
         commands
    fi
    
    case variable in
    pattern1 | pattern2)
        commands1
        ;;
    pattern3) 
        commands2::
        ;;
    *) 
        default commands
        ;;
    esac
    
    
    for var in list
    do
         commands
    done
    
    while test command
    do
         other commands
    done
    
    until test command
    do
         other commands
    done
    
    break n (default 1) 跳出n层循环
    continue n (default 1) 继续n级循环
    
    select var in list
    do
        commands
    done
    

    6.函数

    语法

    [ function ] funname [()]
    {
        action;
        [return int;]
    }
    
    说明:
    1. 能够带function fun()  定义。也能够直接fun() 定义,不带不论什么參数。

    2. 參数返回,能够显式return返回,return后跟数值n(0-255)。假设不加,将以最后一条命令执行结果。作为返回值。

    注意事项

    1. 必须在调用函数地方之前,声明函数,shell脚本是逐行执行。

      不会像其他语言一样先预编译。一次必须在使用函数前先声明函数。

    2. total=$(func 3 2); 通过这样的调用方法。我们清楚知道,在shell 中 单括号中面,能够是:命令语句。

      因此,我们能够将shell中函数。看作是定义一个新的命令。它是命令,因此 各个输入參数直接用 空格分隔。 一次。命令里面获得參数方法能够通过:$0…$n得到。 $0代表函数本身。

    3. 函数返回值,仅仅能通过$? 系统变量获得,直接通过=,获得是空值。事实上,我们依照上面一条理解,知道函数是一个命令,在shell获得命令返回值。都须要通过$?获得。

    4. 须要获得函数值:通过$?获得
    5. 假设须要传出其他类型函数值,能够在函数调用之前。定义变量(这个就是全局变量)。在函数内部就能够直接改动。然后在执行函数就能够读出改动过的值
    6. 假设须要定义自己变量,能够在函数中定义:local 变量=值 ,这时变量就是内部变量,它的改动。不会影响函数外部同样变量的值.

    shell调试模式:

    • bash -x my_script 能够让bash打印出你脚本执行的过程中的全部语句 每一行前加上文件的行号。这会很实用。要做到这样,你仅仅须要设置以下的环境变量: export PS4='+${BASH_SOURCE}:${LINENO}:${FUNCNAME[0]}: '
    • 调试部份的脚本 (注意:我们在执行脚本的时候,不须要使用bash -x了) 有些时候,你并不想调试整个脚本,你仅仅要调试当中的一部份,那么,你能够在你想要调试的脚本之前,调用“set -x”,结束的时候调用“set +x”就能够了
    • bash -n my_script 仅仅检查语法,不执行脚本的模式
    • log一些感兴趣的特定的信息 使用log前。我们先写一个函数:
      _log() {
        if [ "$_DEBUG" == "true" ]; then
            echo 1>&2 "$@"
        fi
      }
      能够在脚本中调用 _log "log msg"
      假设不设置_DEBUG=true, LOG信息就不会打印出来
      
    • 使用脚本调试器。bashdb。开源的。

    经常使用命令

    • 路径切割 dirname 获取文件夹 basename 获取文件名称

    • 生成数字序列 seq start end seq start offset end

    • 字符串截取

    • expr substr $var1 起始位置 截取长度 起始位置从1開始 对""引用的string处理有点问题
    • ${}: ${var:起始位置:截取长度} 起始位置从0開始,建议用这样的

    • 字符串替换 ${var/old/new} 替换第一个匹配的old为new ${var//old/new} 替换全部匹配的old为new

    • cron时间表的格式 min hour dayofmonth dayofweek command crontab -l 列出已有的cron时间表 crontab -e 加入cron时间表事件 cron文件夹, hourly daily monthly weekly /etc/cron.*ly
    
    
  • 相关阅读:
    单例模式
    简单的WPS二次开发脚本
    使用DevExpress改变WinForm皮肤(VS)
    步入DevExpress的使用(VS)
    设置PdfPTable与标题间的距离
    tar: Removing leading `/’ from member names
    MySQL关闭过程详解和安全关闭MySQL的方法
    Nikto是一款Web安全扫描工具,可以扫描指定主机的web类型,主机名,特定目录,cookie,特定CGI漏洞,XSS漏洞,SQL注入漏洞等,非常强大滴说。。。
    解决Centos关闭You have new mail in /var/spool/mail/root提示
    hping3命令
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10504950.html
  • Copyright © 2020-2023  润新知