zoukankan      html  css  js  c++  java
  • 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[*]}
    使用()来定义数组变量,中间使用空格隔开

  • 相关阅读:
    常用/常见Java Web 服务器/应用服务器Logo图文介绍
    三个快速且简单的让你的大脑安静下来的方法
    怎样判断自己是否在程序员平庸者之列?
    “好奇号”火星车和它搭载的软件(来自Erlang程序员的观点)
    旁观者效应”是如何毁掉我们的代码的
    怎么理解面向对象和面向过程到底的本质区别?
    面向对象方法论与结构化方法论的本质区别【转】
    不懂技术的人不要对懂技术的人说这很容易实现
    最近,波兰的程序员Chris(也叫KreCi)公布了他的第十四期程序员收入报告
    计算机专业的学生必须掌握的五门课程 不能掌握他们就不应该获得学位
  • 原文地址:https://www.cnblogs.com/peiya/p/12584424.html
Copyright © 2011-2022 走看看