• shell整理


    转自http://blog.csdn.net/wzzfeitian/article/details/30995303


    基本常识

    1.变量命名规则:

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

    2.变量赋值:

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

    var=1var=$var+1
    echo $var+1输出为1+1,而不是2
    
    可以用如下方法使其输出为2let "var+=1"#var=$[$var+1]#var=$(($var+1))
    echo $var
    或者var=1var= 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

    • 字符串截取

      1. expr substr $var1 起始位置 截取长度 起始位置从1开始 对”“引用的string处理有点问题
      2. ${}: ${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

    每天早上叫醒你的不是闹钟,而是心中的梦~
  • 相关阅读:
    ASP.NET -- repeater控件的使用
    在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。 (provider: 命名管道提供程序, error: 40
    错误提示:在此上下文中不允许使用名称 "***"。有效表达式包括常量、 常量表达式和变量(在某些上下文中),不允许使用列名。
    mongodb 性能提高之利用索引, 待续
    工程化 经历的 4 个阶段
    把连续的字符 变成 一个
    sort 排序详解
    理解正则 的 ?! ?:
    [ 订单查询 ] 性能 高并发 : 分表 与 用户id%1024 存放表
    搭建LNMP基础框架
  • 原文地址:https://www.cnblogs.com/vintion/p/4116864.html
Copyright © 2020-2023  润新知