测试工作常用Linux shell命令-bash基础之变量

对于bash的介绍,网上一大堆,这里不赘述

1、变量定义

* a=1
* b=hello_test
* c="hello test"
* d='hello test "做一名优秀的测试工程师"'
* e=\`ls`

注意说明

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

2、变量使用

* echo $a 
* echo ${b} 
* echo "$a"

注意说明

* 使用$var 或 ${var}来访问变量。后者更为严谨。$var_x ${var}_x 是不同的。
* 在一般的编程语言中,如果变量未被声明,那么调用的时候就会报错;
  但是bash中变量不需要定义也可以使用。引用未定义的变量,默认为空值。

变量操作演示

  • 定义a,b,c,d,e变量,输出
localhost:Documents qinzhen$ ls
TestDev
localhost:Documents qinzhen$ a=1 b=hello_bash c="hello bash" d='hello test "做一名优秀的测试工程师"' e=`ls`
localhost:Documents qinzhen$ echo $a $b $c $d $e
1 hello_bash hello bash hello test "做一名优秀的测试工程师" TestDev
  • 使用未定义的变量
localhost:Documents qinzhen$ echo $aaa

localhost:Documents qinzhen$
  • 若想要在变量后面连接额外的值,需要{}来引用变量
localhost:Documents qinzhen$ echo $a_1

localhost:Documents qinzhen$ echo ${a}_1
hello_1

3、预定义变量

预定义变量是系统预先为我们定义好的变量,在Linux系统启动的时候就已经定义好存在了,包含以下常用预定义变量
$PWD 、 $USER、 $HOME、 $PATH

输出如下:

localhost:Documents qinzhen$ echo $PWD
/Users/qinzhen/Documents
localhost:Documents qinzhen$ echo $USER
qinzhen
localhost:Documents qinzhen$ echo $HOME
/Users/qinzhen
localhost:Documents qinzhen$ echo $PATH
/Users/qinzhen/Documents/TestDev/maven/apache-maven-3.6.1/bin:/Users/qinzhen/Documents/TestDev/apache-jmeter-5.1.1/bin:/Users/qinzhen/Library/Android/sdk/platform-tools:/Users/qinzhen/Library/Android/sdk/tools:/Users/qinzhen/Documents/TestDev/maven/apache-maven-3.6.1/bin:/Users/qinzhen/Documents/TestDev/apache-jmeter-5.1.1/bin:/Users/qinzhen/Library/Android/sdk/platform-tools:/Users/qinzhen/Library/Android/sdk/tools:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

4、数组变量

  • 定义数组
array=(1 2 3 4 60) 
array=(`ls`)
  • 使用反引号(在键盘左上角)表示执行反引号中的命令
localhost:Documents qinzhen$ array=(`ls`)
localhost:Documents qinzhen$ echo $array
TestDev

注意说明

  • 编程语言中,数组的索引都是从0开始的,bash也不例外,但是如果直接输出数组变量会出现如下情况:
localhost:Documents qinzhen$ array=(1 2 3 4 60)
1
  • 没错,会直接默认打印0索引上面的元素,所以bash中数组不能直接这样操作;我们如果想要输出整个数组内容,需要使用echo ${array[*]}命令
localhost:Documents qinzhen$ array=(1 2 3 4 60)
localhost:Documents qinzhen$ echo ${array[*]}
1 2 3 4 60
  • 想要获得数组的长度可以使用echo ${#array[*]}命令
localhost:Documents qinzhen$ echo ${#array[*]}
5
  • 如果想要取出数组中指定的内容,就可以和类似Java、Python等变成语言一样,使用索引(0开始)可以获取,但是能不能使用负数? 有人说可以,有人说不可以——试一下:
localhost:Documents qinzhen$ array=(1 2 3 4 60)
localhost:Documents qinzhen$ echo ${array[1]}
2
localhost:Documents qinzhen$ echo ${array[-1]}
-bash: array: bad array subscript
[16210504@izuf60jasqavbxb9efockpz ~]$ a=(1 2 3 4)
[16210504@izuf60jasqavbxb9efockpz ~]$ echo ${a[-1]}
4

上面的两个结果明显得出了不同的结论,第一个是我本地的结果,第二个是在服务器上的结果
分别打印bash版本查看:

localhost:~ qinzhen$ bash -version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin18)
Copyright (C) 2007 Free Software Foundation, Inc.
[16210504@izuf60jasqavbxb9efockpz ~]$ bash -version
GNU bash, 版本 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.

原因就是bash的版本不同,在bash4.2以后允许使用负值

  • bash中数组不会有索引越界的报错问题,越界后会输出空
localhost:Documents qinzhen$ echo ${array[100]}

localhost:Documents qinzhen$

5、特殊符号的使用

* 双引号用于括起一段字符串值,支持$var形式的变量替换 
* 单引号也表示其内容是字符串值,不支持转义
* \ 反斜线,某些情况下表示转义(也可用-e表示转义)
* $(ls) 表示执行ls后的结果,与``类似,不过可以嵌套
* `反引号。用法比较独特,代表命令的输出,非常有用。
* $(()) 对变量进行操作。比如相加$((a+b)) $((2+3))
* ((a=a+3)) 是整数扩展。把里面的变量当作整数去处理。 
* {1..10} 等价于 seq 1 10,表示1到10
* seq 1 3 10 表示生成一个1到10,步进为3

部分展示

#转义
[16210504@izuf60jasqavbxb9efockpz ~]$ echo "a\nbbbb"
a\nbbbb
[16210504@izuf60jasqavbxb9efockpz ~]$ echo -e "a\nbbbb"
a
bbbb
[16210504@izuf60jasqavbxb9efockpz ~]$ echo -e "a\\nbbbb"
a
bbbb

#变量操作
localhost:~ qinzhen$ a=2;b=3
ocalhost:~ qinzhen$ echo $((a+b))
5
localhost:~ qinzhen$ echo $((2+3))
5

注意说明

  • 数字型变量操作只能进行整数计算
  • 浮点数计算要使用awk 'BEGIN{print 1/3}'
  • 格式化显示可以换用awk 'BEGIN{printf("%.2f\n",1/3)}' 保留2位小数
localhost:~ qinzhen$ awk 'BEGIN{print 1/3}'
0.333333
localhost:~ qinzhen$ awk 'BEGIN{printf("%.2f\n"),1/3}'
0.33

6、变量类型

与Java、Python等语言一样,bash也有变量类型,只不过写起来可以相对”随意“点~

* 字符串 a="xx"
* 数字 i=1314
* 布尔 a=true b=false
  • bash中,可以用echo $?来判断上一条语句执行时成功还是失败,成功输出0,失败输出非0:
localhost:~ qinzhen$ a=1;b=5
localhost:~ qinzhen$ ((a>5))
localhost:~ qinzhen$ echo $?
1
localhost:~ qinzhen$ ((a<5))
localhost:~ qinzhen$ echo $?
0

7、字符串操作

取值
* ${value:offset}  ${value:offset:length} 从变量中提取子串
* ${#value} 字符串长度
* ${#array[*]}和${#array[@]}表示数组中元素的个数 
掐头去尾与内容替换
* ${value#pattern} ${value##pattern} #表示掐头 ##表示贪婪匹配,会一直匹配到最后一个满足的字符
* ${value%pattern} ${value%%pattern} %表示去尾 ##表示贪婪匹配,会一直匹配到最前面一个满足的字符
* ${value/pattern/string} ${value//pattern/string} /表示替换 
* #与## %与%% /与//的区别:最短匹配模式VS最长匹配模式 
* ${var/#Pattern/Replacement} ${var/%Pattern/Replacement}

部分展示

#取值
[1izuf60jasqavbxb9efockpz ~]$ a="hello bash world"
[14@izuf60jasqavbxb9efockpz ~]$ echo ${a:6}
bash world
[1@izuf60jasqavbxb9efockpz ~]$ echo ${#a}
16
#掐头
[1@izuf60jasqavbxb9efockpz ~]$ echo ${a#*o}
bash world
[1@izuf60jasqavbxb9efockpz ~]$ echo ${a##*h}
world
#去尾
[16210504@izuf60jasqavbxb9efockpz ~]$ echo ${a%w*}
hello bash
[16210504@izuf60jasqavbxb9efockpz ~]$ echo ${a%%o*}
hell
#替换
[16210504@izuf60jasqavbxb9efockpz ~]$ echo ${a/bash/linux}
hello linux world
[16210504@izuf60jasqavbxb9efockpz ~]$ echo ${a/o/XXX}
hellXXX bash world
[16210504@izuf60jasqavbxb9efockpz ~]$ echo ${a//o/XXX}
hellXXX bash wXXXrld
[16210504@izuf60jasqavbxb9efockpz ~]$ echo ${a/#*bash/hi~}
hi~ world
[16210504@izuf60jasqavbxb9efockpz ~]$ echo ${a/%w*/WW}
hello bash WW

8、判断的类型

算术判断 、字符串判断 、逻辑判断、 shell内置判断

  • 算数判断—— 注意:判断的数字与[ ]之间必须要有空格
[ 2 –eq 2 ] 相等 equal
[ 2 –ne 2 ] 不等 notEqual
[ 3 –gt 1 ] 大于 greatThen
[ 3 –ge 3 ] 大于等于 gretEqual
[ 3 –lt 4 ] 小于 lessThen
[ 3 –le 3 ] 小于等于 lessEqual
(())也可以表示算术比较。((10>=8)) ,((10==10)),

实践展示:

[16210504@izuf60jasqavbxb9efockpz ~]$ [ 2 -eq 2 ];echo $?
0
[16210504@izuf60jasqavbxb9efockpz ~]$ [ 2 -eq 3 ];echo $?
1
[16210504@izuf60jasqavbxb9efockpz ~]$ [ 2 -ne 2 ];echo $?
1
[16210504@izuf60jasqavbxb9efockpz ~]$ [ 3 -gt 1 ];echo $?
0
[16210504@izuf60jasqavbxb9efockpz ~]$ [ 3 -ge 3 ];echo $?
0
[16210504@izuf60jasqavbxb9efockpz ~]$ [ 3 -lt 4 ];echo $?
0
[16210504@izuf60jasqavbxb9efockpz ~]$ [ 3 -le 3 ];echo $?
0
[16210504@izuf60jasqavbxb9efockpz ~]$ ((10>=8));echo $?
0
[16210504@izuf60jasqavbxb9efockpz ~]$ ((1==2));echo $?
1
  • 逻辑判断
[ 2 -ge 1 -a 3 -ge 4 ];echo $? 与 and
[ 2 -ge 1 -o 3 -ge 4 ];echo $? 或 or

[[ 2 -ge 1 && 3 -ge 4 ]];echo $?[[ 2 -ge 1 || 3 -ge 4 ]];echo $?[ ! 2 -ge 1 ];echo $?
  • 字符串比较
[ string1 = string2 ] 如果两字符串相同,则结果为真
[ string1 != string2 ] 如果两字符串不相同,则结果为真 
[ -n "$var" ] 如果字符串不是空,则结果为真
[ -z "$var" ] 如果字符串是空,则结果为真
[[ "xxxx" == x* ]] 在表达式中表示0或者多个字符
[[ xxx == x?? ]] 在表达式中表示单个字符
在引用变量的时候要记得加双引号[ -z "$a"] 否则当a未定义时会语法报错
  • 内置判断
-e file 如果文件存在,则结果为真
-d file 如果文件是一个子目录,则结果为真 
-f file 如果文件是一个普通文件,则结果为真 
-r file 如果文件可读,则结果为真
-s file 如果文件的长度不为0,则结果为真 
-w file 如果文件可写,则结果为真
-x file 如果文件可执行,则结果为真
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值