对于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 如果文件可执行,则结果为真