• Shell-Bash语言-变量


    变量定义
    a=1
    b=seveniruby
    d="hello from testrhome"
    e='hello from "霍格沃兹测试学院"'

    =左右不要有空格
    如果内容有空格,需要使用单引号或者双引号
    双引号支持转义$开头的变量会被自动替换
    变量使用
    echo $a
    echo ${b}
    echo "$a"

    echo类似print
    使用$var 或${var}来访问变量。后者更为严谨。$var_x${var}_x是不同的。
    变量不需要定义也可以使用。引用未定义的变量,默认为空值。

    #!/bin/bash
    a=1
    b=seveniruby
    echo '$a'
    echo "$a"
    echo ${b}

    运行结果如下:

    预定义变量
    echo $PWD:当前目录
    echo $USER:当前是谁
    echo $HOME:当前主目录
    echo ~:当前主目录
    echo $PATH
    echo $RANDOM
    运行结果如下:

    变量类型
    字符串 a='xx'
    数字 i=1314
    布尔 true false
    数组 array=(a b c)
    函数 foo(){echo hello world}
    高于4.x的shell没有hash词典功能

    数字型变量操作
    计算
      i=1;echo $i;echo $((i+1))
    更新
      ((i=i+1));echo $i
    只能进行整数计算
    浮点数计算请使用awk 'BEGIN{print 1/3}'
    格式化显示可以使用awk 'BEGIN{printf("%.2f ", 1/3)}'

    字符串操作
    取值
      ${value:offset}   ${value:offset:length}从变量中提取子串
      ${#value}字符串长度
      ${#array[*]}和${#array[@]}表示数组中元素的个数

    x="hogwarts"
    echo $x
    echo ${#x}
    echo ${x:3}
    echo ${x:0:3}
    echo ${x:1:3}

    运行结果如下:

    掐头去尾和内容替换
      ${value#pattern} ${value##pattern} #表示掐头
      ${value%pattern} ${value%%pattern} %表示去尾
      ${value/pattern/string} ${value//pattern/string} /表示替换
      #与## %与%% /与//的区别:最短匹配模式VS最长匹配模式
      ${var/#Pattern/Replacement} ${var/%Pattern/Replacement}

    x="hogwarts"
    echo ${x#*g}  #前面的是*,删到g
    x="hogwarts from testerhome"
    echo ${x#*t}
    echo ${x##*t}

    运行结果如下:

    AWK可以替代这些操作,推荐使用AWK

    x="hogwarts from testerhome"
    echo $x | awk 'BEGIN{FS="t"}{print $1}'
    echo $x | awk 'BEGIN{FS="t"}{print $2}'
    echo $x | awk -F "r" '{print $1}'

    运行结果如下:

    布尔变量
    true
    false
    命令执行返回值$?
      任何命令执行都会有一个返回值
      0表示正确
      非0表示错误
    history | tail -10   查看最近的10条命令
    echo $?    返回0,表示上一条命令正常执行

    判断的类型
    算术判断
    [ 2 -eq 2 ] 相等
    [ 2 -ne 2 ] 不等
    [ 3 -gt 1 ] 大于
    [ 3 -ge 3 ] 大于等于
    [ 3 -lt 4 ] 小于
    [ 3 -le 3 ] 小于等于
    (())也可以表示算术比较。((10>8)),((10==10))

    字符串判断

    [ string1 = string2 ] 如果两字符串相同,则结果为真
    [ string1 != string2 ] 如果两字符串不相同,则结果为真
    [ -n "$var" ] 如果字符串不是空,则结果为真
    [ -z "$var" ] 如果字符串是空,则结果为真
    [[ "xxxx" == x* ]] 在表达式中表示0或者多个字符
    [[ xxx == x?? ]] 在表达式中表示单个字符
    在引用变量的时候要记得加双引号[-z "$a"]否则当a未定义时会语法报错
    a=xxxx
    b=xxx
    [ "$a" == "$b" ]
    逻辑判断

    [ 2 -ge 1 -a 3 -ge 4 ];echo $? 与
    [ 2 -ge 1 -o 3 -ge 4 ];echo $? 或
    [[ 2 -ge 1 && 3 -ge 4 ]];echo $? 与
    [[ 2 -ge 1 || 3 -ge 4 ]];echo $? 或
    [ !2 -ge 1 ];echo $? 非

    shell内置判断

    -e file 如果文件存在,则结果为真
    -d file 如果文件是一个子目录,则结果为真
    -f file 如果文件是一个普通文件,则结果为真
    -r file 如果文件可读,则结果为真
    -s file 如果文件的长度不是0,则结果为真
    -w file 如果文件可写,则结果为真
    -x file 如果文件可执行,则结果为真
    [[]]是[]的扩展语法,在老的sh里并不支持。推荐用[]

    数组变量
    array=(1 3 4 6)
    array=('ls')
    array[2]="hello world"

    echo ${array[2]}
    echo ${array[*]}
    echo ${#array[*]}
    使用()来定义数组变量,中间使用空格隔开

  • 相关阅读:
    内存分配略谈
    变量声明顺序和指针偏移问题示例
    解决You have to be inside an Angular CLI project in order to use the serve command
    Linux中将命令放到全局
    Linux设置vim显示行号
    根据指定的excel模板导出数据
    解决 Maven工程运行报错Failed to clean project: Failed to delete
    springcloud工作用常用到的一些注解
    cmd窗口备份mysql数据库
    调用存储过程msql
  • 原文地址:https://www.cnblogs.com/peiya/p/12584424.html
Copyright © 2020-2023  润新知