本章学习内容:

* 1.常见符号
* 2.命令分隔符-分号";"
* 3.双分号 ";;"
* 4. '单引号和"双引号
* 5.`反引号和$()
* 6.${}和$
* 7.冒号:
* 8.()小括号
* 9.(())双括号
* 10.{}大括号
* 11.[]和[[]]之间的条件测试区别
* 12.~波浪号
* 13.延时
* 14.变量赋值的注意
 

1.常见符号

* $0   当前脚本的文件名
* $n        传递给脚本的参数n,比如$1表示第一个参数
* $#        传递给脚本或函数的参数个数。
* $*,$@  传递给脚本或函数的所有参数
* $?        上个命令的退出状态,或函数的返回值。
* $$         当前Shell脚本所在的进程ID
示例:
#!/bin/bash for var in $* do echo "$var" #for循环打印所有参数 done
 

2.命令分隔符分号";"

* 作用:可以在同一行上写两个或两个以上的命令
示例:
if [ "$filename" == "$1" ]; then #执行两条命令 echo "File $filename exists.";fi
 

3.双分号;;

* 作用:用在case语句,类似于C里面的case,用来承担break作用
shell的case语法如下所示:
case "变量" in "变量1") ... ;; #这里的双分号类似于break
"变量2") ... ;;
*) #匹配剩下的变量n ... ;;
esac #case结束语句
示例:
#!/bin/base variable=xyz case "$variable" in abc) echo "\$variable = abc" ;;
xyz)echo "\$variable = xyz" ;; esac
打印:

 

 

4. '单引号和"双引号

* 单引号:  将会阻止所有特殊字符的解释,被单引号括住的内容都是普通字符串
* 双引号: 引号包围起来的字符串,部分特殊字符将起到它们的作用
示例:
#!/bin/bash a="this is a" b="this is b" echo '${a}' echo "${b}"
打印:
${a} this is b
 

5.`反引号和$()

* 都是用来实现命令替换的,可以通过这个将命令的输出赋值到一个变量中去
示例:
echo $(date "+ %Y/%m/%d %H:%M:%S") #运行date命令 echo `date "+ %Y/%m/%d %H:%M:%S"`
#运行date命令 c=$(echo hello) #打印: c=hello
 

6.${}和$

* 都是变量替换,不过${}的好处在于,可以精确变量名称(也可以实现字符串替换等,下章来学习)
比如:
A=123 echo $AB #错误,将打印空的一行,因为运行时默认会去找变量值AB的解释 echo ${A}B #正常打印:123B
 

7.冒号:
空命令,一个什么都不干的命令,该命令的返回值为0(true).
示例如下:
: echo $? # 打印上个命令的返回值,为0
 

由于冒号的返回值为0,所以可以通过>将一个文件清空,但是不会修改该文件权限

示例如下:
: > data.xxx #如果该文件不存在,则会创建, 与cat /dev/null >data.xxx的作用相同
 

8.()小括号

8.1当用作命令组时
()会启动一个子shell顺序运行,需要注意的是, 由于()里的变量位于子shell中,并不是当前shell中,所以退出()后,变量还是不会变的
示例:
a=1 (a=2; echo "a = $a") #打印a=2 echo "a = $a" #打印a=1,说明变量a并没有改变
 

8.2当用作初始化数组时
示例-遍历数组: 
arr=(1 2 3) #等价于array[0]=1 array[1]=2 array[2]=3 for(( i=0;i<${#arr[@]};i++))
do echo ${arr[i]}; done;
 

8.3当用作命令替换时
示例:
echo $(date "+ %Y/%m/%d %H:%M:%S") #运行date命令
 

9.(())双括号

9.1用于for循环时
示例:
for(( i=0;i<5;i++));do echo $i;done

9.2转换运算进制时,可以通过(())将任意数据转为10进制
示例:
echo $((16#ff)) #打印255
 

9.3 用于整数判断时
示例:
if (("$a" < "$b")) if (("$a" <= "$b")) if (("$a" > "$b")) if (("$a" >= "$b"))
 

10.{}大括号
10.1当用做代码块时
像一个匿名函数,但是{}里的变量对其它代码来说是可见的, 并且不会开启新的子shell
示例1:
a=1 { a=2 echo "a = $a" #打印a=2 } echo "a = $a" #打印a=2,说明已被修改
示例2-写入文件:
#!/bin/bash { echo 'hello' echo 'this is test file' echo 'end' } > ./test
效果:



 

10.2当用做遍历时
示例:
echo {1..10} #打印1 2 3 4 5 6 7 8 9 10 for var in {a..z} do echo $var #打印a~z字母
done
 

10.3也可以用作字符变量截取替换时
未完待续,在下一章将学习.

 

11.[ ]和[[]]之间的条件测试区别
11.1 [ ]的参数有以下几种

* -z: 判断字符串长度为0则为真
* -n: 判断字符串长度非0则为真
* -o: 或
* -a: 与
* -x: 可执行
* -r:  可读
* -w: 可写
11.2当用作文件判断时,有以下几种参数:

* -e filename  :如果 filename存在,则为真
* -d filename  :如果 filename为目录,则为真
* -f filename   :如果 filename为常规文件,则为真
* -L filename  : 如果 filename为符号链接,则为真
* -r filename   :如果 filename可读,则为真
* -w filename  :如果 filename可写,则为真
* -x filename  :如果 filename可执行,则为真
* -s filename  :如果文件长度不为0,则为真
* -h filename  :如果文件是软链接,则为真  
* filename1 -nt filename2 :如果 filename1比 filename2新,则为真。
* filename1 -ot filename2 :如果 filename1比 filename2旧,则为真。
示例-检查当前目录的test文件是否存在:
#!/bin/bash testfile="${PWD}/test" if [ -e "$testfile" ];then echo " $testfile
is exist" fi
 

11.3 在比较整数时,都使用-eq -ne –gt –ge –lt -le等
示例:
//-eq 判断等于(equal) if [ "$a" -eq "$b" ] //-ne 判断不等于(no equal) if [ "$a" -ne "$b"
]//-gt 大于(greater than) if [ "$a" -gt "$b" ] //-ge 大于等于 if [ "$a" -ge "$b" ] //
-lt 小于(less than) if [ "$a" -lt "$b" ] //-le 小于等于 if [ "$a" -le "$b" ]
 

11.4比较字符串时,只能使用!=和=,如果使用大于小于时,则需要加 \ 转义
示例:
a="abcde" b="abc" if [ -n "$a" -o "$a" \> "$b" ] #判断a非0,且a>b then echo "a > b"
fi
 

11.5而[[]]也能适用于整数和字符串,而且对于整数或者字符串而言,它们都可以支持&&、||、<和>、!=、==
示例:
a=11 b=11 c="abc" e="abcd" if [[ "$a" == "$b" && "$c" < "$e" ]] then echo "a =
b,c < e" fi
 

12.~波浪号

* ~    为home目录
* ~+  为当前目录,等价于$PWD
示例:
A=~ B=~+ echo $A #打印home目录 echo $B #打印当前目录
 

13.延时

* 在shell中,延时使用sleep命令
示例:
sleep 1 #延时1秒 sleep 0.5 #延时0.5秒 sleep 1m #睡眠1分 sleep 1h #睡眠1小时
 

14.变量赋值时的注意

* 如果变量里存在空白,则必须加上引用
示例:
a= 1 2 3 #将会出错,正确的用法应该是a="1 2 3"
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信