zoukankan      html  css  js  c++  java
  • linux shell 学习笔记--变量声明与赋值,循环

    Bash 变量是不分类型的
    ------------------------
    不像其他程序语言一样,Bash 并不对变量区分"类型".本质上,Bash 变量都是字符串.
    但是依赖于上下文,Bash 也允许比较操作和算术操作.决定这些的关键因素就是,变量中的值
    是否只有数字.
    赋值
    a=123
    a="sdsd"   #注意=左右不要有空格,否则就变成比较字符串操作
    引用
    $a #借助$符
    操作字符串
    字符穿连接 
       a="sdfs" 
       b="dsds"
       c=$a$b  
    --------------
    Bash 支持超多的字符串操作,操作的种类和数量令人惊异.但不幸的是,这些工具缺乏集中性.
    一些是参数替换的子集,但是另一些则属于UNIX 的expr 命令.这就导致了命令语法的不一致和
    功能的重叠,当然也会引起混乱.
    字符串长度
    ${#string}
    expr length $string
    expr "$string" : '.*'
    1 stringZ=abcABC123ABCabc
    2
    3 echo ${#stringZ} # 15
    4 echo `expr length $stringZ` # 15
    5 echo `expr "$stringZ" : '.*'` # 15
    从字符串开始的位置匹配子串的长度
    expr match "$string" '$substring'
    $substring 是一个正则表达式
    expr "$string" : '$substring'
    $substring 是一个正则表达式
    1 stringZ=abcABC123ABCabc
    2 # |------|
    3
    4 echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8
    5 echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8
    expr index $string $substring
    匹配到子串的第一个字符的位置.
    1 stringZ=abcABC123ABCabc
    2 echo `expr index "$stringZ" C12` # 6
    3 # C position.
    4
    5 echo `expr index "$stringZ" 1c` # 3
    6 # 'c' (in #3 position) matches before '1'.
    在 C 语言中最近的等价函数为strchr().
    提取子串
    ${string:position}
    在 string 中从位置$position 开始提取子串.
    如果$string"*""@",那么将提取从位置$position 开始的位置参数,[1]
    ${string:position:length}
    在 string 中从位置$position 开始提取$length 长度的子串.
    ################################Start
    Script#######################################
    1 stringZ=abcABC123ABCabc
    2 # 0123456789.....
    3 # 0-based indexing.
    4
    5 echo ${stringZ:0} # abcABC123ABCabc
    6 echo ${stringZ:1} # bcABC123ABCabc
    7 echo ${stringZ:7} # 23ABCabc
    8
    9 echo ${stringZ:7:3} # 23A
    10 # 3 个字符长度的子串.
    子串削除
    ${string#substring}
    从$string 的左边截掉第一个匹配的$substring
    ${string##substring}
    从$string 的左边截掉最后一个个匹配的$substring
    1 stringZ=abcABC123ABCabc
    2 # |----|
    3 # |----------|
    4
    5 echo ${stringZ#a*C} # 123ABCabc
    6 # 截掉'a''C'之间最近的匹配.
    7
    8 echo ${stringZ##a*C} # abc
    9 # 截掉'a''C'之间最远的匹配.
    ${string%substring}
    从$string 的右边截掉第一个匹配的$substring
    ${string%%substring}
    从$string 的右边截掉最后一个匹配的$substring
    1 stringZ=abcABC123ABCabc
    2 # ||
    3 # |------------|
    4
    5 echo ${stringZ%b*c} # abcABC123ABCa
    6 # 从$stringZ 的后边开始截掉'b''c'之间的最近的匹配
    7
    8 echo ${stringZ%%b*c} # a
    9 # 从$stringZ 的后边开始截掉'b''c'之间的最远的匹配
    子串替换
    ${string/substring/replacement}
    使用$replacement 来替换第一个匹配的$substring.
    ${string//substring/replacement}
    使用$replacement 来替换所有匹配的$substring.
    1 stringZ=abcABC123ABCabc
    2
    3 echo ${stringZ/abc/xyz} # xyzABC123ABCabc
    4 # 用'xyz'来替换第一个匹配的'abc'.
    5
    6 echo ${stringZ//abc/xyz} # xyzABC123ABCxyz
    7 # 用'xyz'来替换所有匹配的
    个人觉得条件判断框的格式要求很严格,'[' 前后都必须有一个空格
    if 结构
    
    if [ condition1 ]
    then
        if [ condition2 ]
        then
            do-something # 这里只有在condition1 和condition2 都可用的时候才行.
        fi
    elif [ condition3 ]
    then
        do ...
    else
        do ....
    fi
    
    case 结构    注意要以 ;;结束
    case "$variable" in
    abc) echo "$variable = abc" ;;
    xyz) echo "$variable = xyz" ;;
    *) echo "dfsdf" ;;  #*表示default,若上面匹配都不成功则会执行
    esac
    
    
    for 结构 这是一个基本的循环结构.它与C 的相似结构有很大不同.
    # 标准语法.
    for a in 1 2 3 4 5 6 7 8 9 10
    do
        echo -n "$a "
    done
    
    LIMIT=10
    
    for ((a=1; a <= LIMIT ; a++)) # Double parentheses, and "LIMIT" with no "$".
    for ((a=1; a <= LIMIT ; a++)) # 双圆括号, 并且"LIMIT"变量前边没有 "$".
    do
        echo -n "$a "
    done
    
    while [condition]
    do
        command...
    done
    
    和 for 循环一样,如果想把do 和条件放到同一行上还是需要一个";".
    while [condition]; do
    
    C风格语法
    while (( a <= LIMIT )) # 双圆括号, 变量前边没有"$".
    do
       echo -n "$a "
       ((a += 1)) # let "a+=1"
       # Yes, 看到了吧.
       # 双圆括号允许像C 风格的语法一样增加变量的值.
    done
    
    until
    这个结构在循环的顶部判断条件,并且如果条件一直为false 那就一直循环下去.(与while
    相反)
    until [condition-is-true]
    do
    command...
    done
    注意: until 循环的判断在循环的顶部,这与某些编程语言是不同的.
    与 for 循环一样,如果想把do 和条件放在一行里,就使用";".
    until [condition-is-true]; do
  • 相关阅读:
    web.config配置错误的后果
    重装VS.NET碰到:IDE 未能加载 Dte.olb
    初次使用Wix
    typedef
    [WTL] Accelerator
    在浏览器中粘贴时替换剪贴板数据
    自定义浏览器
    关于MSHTML
    [WTL] STLport安装指南
    [WTL] WTL7.5中CFileDialog用'\0'过滤
  • 原文地址:https://www.cnblogs.com/zendu/p/4991016.html
Copyright © 2011-2022 走看看