1、变量定义
echo hello word #hello word,echo命令用于向屏幕输出内容
a=1 echo $a #1
a=hello word echo $a #报错, a='hello word'/a="hello word" echo $a #hello word
a="hello word" echo 'abc $a' #abc $a
a="hello word" echo "abc $a" #abc hello word
a="hello" echo $a_1 #什么也没输出,相当于把a_1当成一个变量,直接输出一个没有定义的变量,返回空
a="hello" echo $a _1 $hello _1
a="hello" echo ${a}_1 $hello_1 ,echo ${a}严谨的引用变量a的方法
- = 左右两边不能有空格
- 如果内容有空格,需要使用单引号或者双引号
- 双引号支持转义 $开头的变量会被自动替换
2、 预定义变量
echo ${PWD} /$PWD #输出pwd命令的东西
echo $USER #输出当前用户的用户名
echo $PATH #输出环境变量
echo $HOME #输出home目录
3、数组变量
数组定义 :b=(1 2 3 4 5) #元素之间通过空格隔开
b=(1 2 3 4 5)echo $b #1,只能输出第0个元素
b=(1 2 3 4 5) echo ${b[*]}/echo ${b[@]} #1 2 3 4 5,输出数组的所有元素
b=(1 2 3 4 5) echo ${b[2]} #3,输出数组的第3个元素
b=(1 2 3 4 5) echo ${b[-1]} #5,输出数组的倒数第一个元素
b=(1 2 3 4 5) echo ${#b[*]}/echo ${#b[@]} # 5,输入数组中元素的个数
反引号的用处
a=`ls` echo $a #输出ls命令的内容,`ls`ls加上反引号,键盘上在上角数字1旁边的键
a=(`ls`) echo ${a[*]} /echo ${b[@]} #将ls命令输出的内容写入一个数组,通过取出数据元素的方式取出每个元素
4、特殊字符的使用
1)单引号和双引号:双引号用于括起一段字符串值,支持$var形式的变量替换,单引号也表示其内容是字符串值,不支持转义
2)\ 反斜杠:某些情况下表示转义
echo "a\nbb" #a\nbb
echo -e "a\nbb"
#a
bb #-e开起了转义模式,将\n转义成了换行
3)$(ls)表示执行ls后的结果,与``类似。不过可以嵌套
echo $(ls) #输出ls命令的内容,不是所有linux系统都支持
echo `ls` #输出ls命令的内容
4)``反引号:用法比较独特,代表命令的输出,非常有用
5)$(())对变量进行操作,必须是双括号
6)(())是整数扩展。把里面的变量当作整数去处理
a=5
((a=a+5))
echo $a #10
7) ({1..10})等价于seq 1 10,表示1到10
8) echo $?
a=2;b=3;((a<b));echo $? #0,echo $?判断前面的操作是true(0)还是false(非0的数字)
a=2;b=3;((a>b));echo $? #1,echo $?判断前面的操作是true(0)还是false(非0的数字)
ls test.txt;echo $? #0,如果当前目录下有test.txt这个文件就为true返回0
ls fff;echo $? #2,当前目录下没有fff这个文件就为false返回非0
9)一些小数的运算
echo $((2/3)) #0
awk "BEGIN{print 2/3}" #0.666667
5、变量类型
字符、数字、Boolean
6、字符串的切片
s="hello from testerhome";echo ${s:6} #from testerhome,从开始位置去掉6位
s="hello from testerhome";echo ${s:6:4} #from
s="hello from testerhome";echo ${#s} #21,这个字符串的长度
s="hello from testerhome";echo ${s#hel} #lo from testerhome,掐头
s="hello from testerhome";echo "${s#*o}" # from testerhome,掐掉o及其之前的内容
s="hello from testerhome";echo "${s#*m}" # testerhome,掐掉m及其之前的内容
s="hello from testerhome";echo "${s##*m}" # e,贪婪匹配,匹配到m及其前面的都去掉
s="hello from testerhome";echo "${s##*o}" #me,贪婪匹配,匹配到o及其前面的都去掉
s="hello from testerhome";echo "${s%home}" #hello from tester,去尾,从后面匹配,匹配到了home去掉
s="hello from testerhome";echo "${s%o*}" #hello from testerh
s="hello from testerhome";echo "${s%%o*}" #hell,去尾,贪婪匹配,从最后开始匹配到最前面一个o,将它及其后面的去年
s="hello from testerhome";echo ${s/testerhome/wulala} #hello from wulala,替换字符串中的内容
7、逻辑计算:
-eq: 相等 [ 2 -eq 2 ];echo $? #0,2=2为真,注意空格必须有
-ne:不等于 [ 2 -ne 2 ];echo $? #1,2不等于2为false所以返回非0
-gt:大于 [ 2 -gt 2 ];echo $? #
-ge:大于等于 [ 2 -ge 2 ];echo $? #
-lt:小于 [ 2 -lt 2 ];echo $? #
-le:小于等于 [ 2 -le 2 ];echo $? #
-a :逻辑与 [ 2 -le 2 -a 3 -ge 2 ] ;echo $? #0,2小于等于2并且3大于等于3
-o :逻辑或 [ 2 -le 2 -o 3 -ge 2 ] #0,2小于等于2或者3大于等于3
8、shell内置判断
-e file如果文件存在,则结果为真 ,[ -e test ];echo $? #0,如果test这个文件存在就为true返回0
-d 如果文件是一个子目录 ,则结果为真
-f 如果文件是一个普通文件,则结果为真
-r 如果文件可读,则结果为真
-s 如果文件的长度不为0,则结果为真
-w 如果文件可写,则结果为真
-x 如果文件可执行,则结果为真