《Linux运维之道》笔记二

{}花括号的用法

  • 逗号,分隔多个项目

    echo {a,b,c} #打印出a b c  
    echo user{01,02,03} #打印出user01 user02 user03  
    mkdir a{1,2,3} #创建文件夹a1,a2,a3
    
  • 连续两点..创建连续序列

    echo a{1..10} #打印出a1 a2 a3 a4 a5 a6 a7 a8 a9 a10  
    mkdir b{1..5} #创建文件夹b1 b2 b3 b4 b5
    

一、变量

  • typeset 为变量添加只读属性,防止误操作,当你想改值的时候,会报错。

    NAME=pengloo53
    typeset -r NAME
    NAME=pengloo
    

  • read -p "Please input your name:" NAME 提示符后输入值赋值给变量

  • export NAME 将普通变量转换成环境变量

1、变量的展开替换

  • ${varname:-word} 若varname存在且非null,则返回其值,否则返回word
  • ${varname:=word} 若varname存在且非null,则返回其值,否则设置为word
  • ${varname:?message} 若varname存在且非null,则返回其值,否则显示varname:message
  • ${varname:+word}若varname存在且非null,则返回word,否则返回null
  • ${variable#key} 从头开始删除关键词,执行最短匹配
  • ${variable##key} 从头开始删除关键词,执行最长匹配
  • ${variable%key} 从尾开始删除关键词,执行最短匹配
  • ${variable%%key} 从尾开始删除关键词,执行最长匹配
  • ${variable/old/new}将old替换成new,仅替换第一个出现的old
  • ${variable//old/new}将old替换成new,替换所有的old

2、数组

  • ${name[subscript]}调用数组变量的值,如果subscript为@*则调用所有的数组成员。

    A=(11 22 33)
    echo ${A[0]}  #显示11
    echo ${A[@]}  #显示11 22 33
    echo ${A[*]}  #显示11 22 33
    
  • ${ #name[subscript]}返回${name[subscript]}的长度。

    B=(aa bbb cccc)
    echo ${ #B[2]} #显示4(cccc字符串的长度)
    echo ${ #B[@]} #显示3(数组成员个数)
    

3、算数运算

expr命令工具大部分应该都知道,如下:

  • expr 8 + 4 加法
  • expr 8 - 4 减法
  • expr 8 \* 4 乘法
  • expr 8 / 4 除法

然而你也可以通过变量表达式来进行算术运算,语法为:$((expression)),例如:

  • $((x+y))
  • $((x-y))
  • $((x*y))
  • $((x/y))
  • $((x%y)) 取余
  • $((x++)) 自加
  • $((x--)) 自减
  • $((x**y)) 幂运算

4、测试运算

命令行工具test ,应该不陌生,这里举几个例子就清楚了。

  • test -d /etc/ && echo "yes" || echo "no"/etc/是目录就显示yes,不是就显示no,它等价与[ -d /etc/ ] && echo "yes" || echo "no"

一对中括号就替代了test,这里注意的是,中括号左右都要留有空格。

二、正则表达式

1、基本正则表达式(grep)

  • . 任意单个字符
  • * 匹配前一个字符出现零次或者多次
  • [] 匹配集合中任意单个字符
  • [x-y] 匹配连续的字符串范围
  • ^ 匹配字串的开头
  • $ 匹配字串的结尾
  • [^] 集合取反
  • \ 转义后的字符串
  • \{n,m\} 匹配前一个字符重复n到m次
  • \{n,\} 匹配前一个字符重复至少n次
  • \{n\} 匹配前一个字符重复n次
  • \(\)\(\)之间的内容存储在『保留空间』,最大存储9个
  • \n 通过\1\9调用保留空间中的内容

除了最后两个,其他的都比较好理解,针对最后两个举个例子:grep --color "\(root\)\(:\).*\2\1" /etc/passwd 筛选出以root:开头,以:root结尾的行。

2、扩展的正则表达式(egrep)

  • + 匹配前一个字符出现一次或者多次
  • ? 匹配前一个字符出现零次或者一次
  • | 匹配逻辑or
  • () 匹配正则集合

egrep --color '(root|admin)' /etc/passwd 找出包含root或者admin的行。

3、Others

除了上述的一些表达式,还有基于其他规范的正则表达式,例如POSIX规范以及GNU规范。这里不列举了,可以自行搜索了解。