• 1.shell学习之常用语句


    本章学习内容:

    • 1.常见符号
    • 2.命令分隔符-分号";"
    • 3.双分号 ";;"
    • 4. '单引号和"双引号
    • 5.`反引号和$()
    • 6.${}和$
    • 7.冒号:
    • 8.()小括号
    • 9.(())双括号
    • 10.{}大括号
    • 11.[]和[[]]之间的条件测试区别
    • 12.~波浪号
    • 13.延时
    • 14.变量赋值的注意
    • 15 printf命令使用

    1.常见符号

    • $0   当前脚本的文件名
    • $n        传递给脚本的参数n,比如$1表示第一个参数
    • $#        传递给脚本或函数的参数个数。
    • $*,$@  传递给脚本或函数的所有参数
    • $?        上个命令的退出状态,或函数的返回值。
    • $$         当前Shell脚本所在的进程ID

    示例:

    #!/bin/bash
    
    for var in $*
    do
       echo "$var"           #for循环打印所有参数
    done

    2.命令分隔符分号";"

    • 作用:可以在同一行上写两个或两个以上的命令

    示例:

    if [ "$filename" == "$1" ]; then     #执行两条命令
    echo "File $filename exists.";fi

    3.双分号;;

    • 作用:用在case语句,类似于C里面的case,用来承担break作用

    shell的case语法如下所示:

    case "变量" in
      "变量1")
          ...
      ;;          #这里的双分号类似于break
    "变量2") ... ;;
    *) #匹配剩下的变量n ... ;;
    esac #case结束语句

    示例:

    #!/bin/base
    
    variable=xyz
    
    case "$variable" in
    abc) echo "$variable = abc" ;;
    xyz) echo "$variable = xyz" ;; 
    esac

    打印:

     

    4. '单引号和"双引号

    • 单引号:  将会阻止所有特殊字符的解释,被单引号括住的内容都是普通字符串
    • 双引号: 引号包围起来的字符串,部分特殊字符将起到它们的作用

    示例:

    #!/bin/bash
    
    a="this is a"
    b="this is b"
    
    echo '${a}'
    echo "${b}"

    打印:

    ${a}
    this is b

    5.`反引号和$()

    • 都是用来实现命令替换的,可以通过这个将命令的输出赋值到一个变量中去

    示例:

    echo $(date "+ %Y/%m/%d %H:%M:%S")     #运行date命令
    echo `date "+ %Y/%m/%d %H:%M:%S"`      #运行date命令
    c=$(echo hello)                        #打印: c=hello

    6.${}和$

    • 都是变量替换,不过${}的好处在于,可以精确变量名称(也可以实现字符串替换等,下章来学习)

    比如:

    A=123
    
    echo $AB      #错误,将打印空的一行,因为运行时默认会去找变量值AB的解释
    echo ${A}B    #正常打印:123B

    7.冒号:
    空命令,一个什么都不干的命令,该命令的返回值为0(true).
    示例如下:

    :
    echo $?    # 打印上个命令的返回值,为0

    由于冒号的返回值为0,所以可以通过>将一个文件清空,但是不会修改该文件权限

    示例如下:

    : > data.xxx         #如果该文件不存在,则会创建, 与cat /dev/null >data.xxx的作用相同

    8.()小括号

    8.1当用作命令组时
    ()会启动一个子shell顺序运行,需要注意的是, 由于()里的变量位于子shell中,并不是当前shell中,所以退出()后,变量还是不会变的
    示例:

    a=1
    (a=2; echo "a = $a")    #打印a=2
    echo "a = $a"           #打印a=1,说明变量a并没有改变

    8.2当用作初始化数组时
    示例-遍历数组: 

    arr=(1 2 3)             #等价于array[0]=1 array[1]=2 array[2]=3
    
    for(( i=0;i<${#arr[@]};i++)) 
    do
    echo ${arr[i]};
    done;

    8.3当用作命令替换时
    示例:

    echo $(date "+ %Y/%m/%d %H:%M:%S")    #运行date命令

    9.(())双括号

    9.1用于for循环时
    示例:

    for(( i=0;i<5;i++));do
    echo $i;done


    9.2转换运算进制时,可以通过(())将任意数据转为10进制
    示例:

    echo $((16#ff))    #打印255

    9.3 用于整数判断时
    示例:

    if (("$a" < "$b"))
    if (("$a" <= "$b"))
    if (("$a" > "$b"))
    if (("$a" >= "$b"))
    
     

    10.{}大括号
    10.1当用做代码块时
    像一个匿名函数,但是{}里的变量对其它代码来说是可见的, 并且不会开启新的子shell
    示例1:

    a=1
    {
       a=2
       echo "a = $a"   #打印a=2
    } 
    echo "a = $a"      #打印a=2,说明已被修改

    示例2-写入文件:

    #!/bin/bash
    {
    echo 'hello'
    echo 'this is test file'
    echo 'end'
    }  > ./test

    效果:

    10.2当用做遍历时
    示例:

    echo {1..10}        #打印1 2 3 4 5 6 7 8 9 10
    for var in {a..z}
    do
    echo $var           #打印a~z字母
    done

    10.3也可以用作字符变量截取替换时
    未完待续,在下一章将学习.

     

    11.[ ]和[[]]之间的条件测试区别
    11.1 [ ]的参数有以下几种

    • -z: 判断字符串长度为0则为真
    • -n: 判断字符串长度非0则为真
    • -o: 或
    • -a: 与
    • -x: 可执行
    • -r:  可读
    • -w: 可写

    11.2当用作文件判断时,有以下几种参数:

    • -e filename  :如果 filename存在,则为真
    • -d filename  :如果 filename为目录,则为真
    • -f filename   :如果 filename为常规文件,则为真
    • -L filename  : 如果 filename为符号链接,则为真
    • -r filename   :如果 filename可读,则为真
    • -w filename  :如果 filename可写,则为真
    • -x filename  :如果 filename可执行,则为真
    • -s filename  :如果文件长度不为0,则为真
    • -h filename  :如果文件是软链接,则为真  
    • filename1 -nt filename2 :如果 filename1比 filename2新,则为真。
    • filename1 -ot filename2 :如果 filename1比 filename2旧,则为真。

    示例-检查当前目录的test文件是否存在:

    #!/bin/bash
    
    testfile="${PWD}/test"
    
    if [ -e "$testfile" ];then
          echo " $testfile is exist"
    fi

    11.3 在比较整数时,都使用-eq -ne –gt –ge –lt -le等
    示例:

    //-eq 判断等于(equal)
    if [ "$a" -eq "$b" ]
    
    //-ne 判断不等于(no equal)
    if [ "$a" -ne "$b" ]
    
    //-gt 大于(greater than)
    if [ "$a" -gt "$b" ]
    
    //-ge 大于等于
    if [ "$a" -ge "$b" ]
    
    //-lt 小于(less than)
    if [ "$a" -lt "$b" ]
    
    //-le 小于等于
    if [ "$a" -le "$b" ]

    11.4比较字符串时,只能使用!=和=,如果使用大于小于时,则需要加 转义
    示例:

    a="abcde"
    b="abc"
    
    if [ -n "$a" -o "$a" > "$b" ] #判断a非0,且a>b
    then
    echo "a > b"
    fi

    11.5而[[]]也能适用于整数和字符串,而且对于整数或者字符串而言,它们都可以支持&&、||、<和>、!=、==
    示例:

    a=11
    b=11
    c="abc"
    e="abcd"
    
    if [[ "$a" == "$b" && "$c" < "$e" ]]
    then
    echo "a = b,c < e"
    fi

    12.~波浪号

    • ~    为home目录
    • ~+  为当前目录,等价于$PWD

    示例:

    A=~
    B=~+
    echo $A            #打印home目录
    echo $B            #打印当前目录

    13.延时

    • 在shell中,延时使用sleep命令

    示例:

    sleep 1     #延时1秒
    sleep 0.5   #延时0.5秒
    sleep 1m    #睡眠1分
    sleep 1h    #睡眠1小时

    14.变量赋值时的注意

    • 如果变量里存在空白,则必须加上引用

    示例:

    a= 1 2 3     #将会出错,正确的用法应该是a="1 2 3"

     

    15 printf命令使用

    • 在shell中可以通过printf来获取/打印数据的格式

    使用示例1:

    printf %d 0xF    //16进制转换成10进制
    15
    
    printf %x 15   //10进制转换成16进制
    f
    
    printf %o 9       //10进制转换成8进制
    11

    示例2-随机获取一串12位的十六进制数:

    #!/bin/bash
    
    # 每次调用$RANDOM都会返回不同的随机整数.
    # 一般范围为: 0 - 32767 (有符号的16-bit整数).
    
    hwadr=""
    for(( i=0; i<12; i++ ));do
            hw[i]=$(($RANDOM%16));
            a=$(printf %x ${hw[i]})
            hwadr=${hwadr}${a}
    done
    
    echo $hwadr

     效果如下所示-每次运行则打印不同数据:

  • 相关阅读:
    2017-4-25 winform公共控件属性 菜单和工具栏属性
    2017-4-24 winform窗体基础属性 ico图片生成 不规则窗体的移动 恶搞小程序
    2017-4-23 知识补充
    C# 动态方法和静态方法的区别 (转)
    2017-4-21 Ado.net字符串攻击 防御 实体类 数据访问类 属性扩展 三层架构开发
    ToString()用法 select top 子句
    2017-4-19 ado.net 增,删,改,查,练习
    2017-4-17 类库 通用变量 is和as运算符 委托
    2017-4-16 多态 构造函数 方法重载 静态方法和静态成员
    【2017-03-12】SQL Sever 子查询、聚合函数
  • 原文地址:https://www.cnblogs.com/lifexy/p/10159634.html
Copyright © 2020-2023  润新知