# 将&&前后的两个命令当做一个表达式,如果表达式出错,那么可以认为该表达式为false ➜ ~ ls / && date bin boot dev etc home initrd.img initrd.img.old lastore lib lib64 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var vmlinuz vmlinuz.old Thu Mar 21 14:18:44 HKT 2019 # 第一个命令失败,后面的命令不再执行。短路,因为表达式整体的值已经可以通过第一个表达式获得。 ➜ ~ ls /hello && date ls: cannot access '/hello': No such file or directory # 与&&恰好相反 ➜ ~ ls /hello || date ls: cannot access '/hello': No such file or directory Thu Mar 21 14:19:03 HKT 2019 # 第一个执行成功,已经可以获得整个表达式的值,所以不执行第二个表达式。短路。 ➜ ~ ls / || date bin boot dev etc home initrd.img initrd.img.old lastore lib lib64 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var vmlinuz vmlinuz.old
分号;
表示过程,不计算值,因此按顺序执行。
1 2 3 4 5 6
➜ ~ ls / ; date bin boot dev etc home initrd.img initrd.img.old lastore lib lib64 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var vmlinuz vmlinuz.old Thu Mar 21 14:23:48 HKT 2019 ➜ ~ ls /hello ; date ls: cannot access '/hello': No such file or directory Thu Mar 21 14:23:52 HKT 2019
#!/bin/bash echo $# echo $* echo $@ echo $0 echo $1 echo $2 echo "--------" # 当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔。 for a in $* do echo ${a} done
for a in $@ do echo ${a} done echo "--------" # 但是当它们被双引号" "包含时,就会有区别了: # "$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。 # "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。 for a in "$*" do echo ${a} # 这 2 个参数会合并到一起形成一份数据,它们之间是无法分割的 done
for a in "$@" do echo ${a} # 这 2 个参数是相互独立的,它们是 2 份数据 done
输出如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
➜ Documents ./shell.sh hello world 2 hello world hello world ./shell.sh hello world -------- hello world hello world -------- hello world hello world