文章目录
${arr[@]}
和${arr[*]}
的区别
其实二者都是表示数组所有元素,但有一丁点小的区别,那就是${arr[*]}
配上双引号就会被识别为字符串,但是${arr[@]}
就很纯粹了,它总是数组,所以我们推荐使用${arr[@]}
的型式。我们看看下面简单的例子
arr=(1 2 3);
# 正常输出数组各个元素无异常
for a in ${arr[@]}
do
echo "$a";
done;
# 正常输出数组各个元素无异常
for a in ${arr[*]}
do
echo "$a";
done;
# 正常输出数组各个元素无异常,即使加了双引号也依旧被识别为数组
for a in "${arr[@]}"
do
echo "$a";
done;
# 加了双引号被识别成一个字符串,而不是数组了,循环只会被进行一次,打印的是一行字符串!
for a in "${arr[*]}"
do
echo "$a";
done;
echo
和printf
的区别
echo
和printf
都可以用来输出文本值,但是printf
更强大,支持格式化输出,echo
自带换行
无论是echo
还是printf
我们不得不注意的是在控制台输出语句写感叹号是有问题,但是 sh 文件中写是没有问题,因为在命令台写感叹号输出会把感叹号识别为命令行历史替换符号,比如说!!
表示执行上一个命令等,感叹号有许多妙用,在双引号中感叹号甚至不支持转义!所以在命令台时候我们要这样写echo "hello world"!
或者echo hello world\!
# 区别一:echo 可以自动换行,printf 不能
echo "hello world!";
printf "hello world!\n"
# 区别二:printf 支持格式化输出,echo 不能
echo "hello world!"
printf "%s\n" "hello world!"
# 区别三:打印数组的区别
# 以字符串的型式正常打印出全部
echo "${a[@]}";
echo "${a[*]}";
# 打印存在问题,只能打印数组的第一个值,且后面的换行符失效
printf "${a[@]}\n";
# 但是 ${a[*]} 加上双引号会被识别成一个字符串,这样又是可行的
printf "${a[*]}\n";
# 打印无问题,可以完好的打印完整数组
printf "%d " "${arr[@]}";
-z
和-n
和!
的区别
# -z 只可以在 [] 和 [[]] 中使用;为空就执行,识别 a="" 为空
if [[ -z $a ]]
# -n 只可以在 [] 和 [[]] 中使用;不为空就执行,识别 a="" 为空
if [[ -n $a ]]
# ! 表示取反,可以在 [] [[]] (()) 中都可以使用,识别 a="" 为空,效果与 -z 一样,! 使用更广泛一些
if ((! $a))
''
和""
的区别
a=1;
# shell 中单引号不能识别当中的变量,也就是说只能全部识别为字符串
echo '$a';
# shell 中双引号可以识别当中的变量,但是无法识别其中的算术运算符,也不能识别正则,通配符,所以说功能有限
echo "$a";
ls -l
和ll
命令的区别
二者效果没有区别,都是详细显示当前文件夹下的文件(不包括隐藏文件),ll
只不过是ls -l
的别名罢了,man ll
是搜不到这个命令的,其只是别名罢了
ls -l
ll
let
和(())的区别
二者可以相互转化,二者都是可以将整数进行算数运算,输出的结果也都是整数,都不可接收浮点数,计算结果如果是小数也会转成整数(去小数位),而且写在其中的变量都可以不加美元符,但是let
语句无法输出,双括号却可以输出通过$((a))
的形式即可,这算是二者唯一的一个区别吧
a=1;
let "a++";
((a+=1));
$()
和``
的区别
二者主要是为了放置有输出的命令行,这样方便在 shell 中使用命令来扩展操作,都表示将命令的输出作为变量赋给某个新变量,二者可以替换。个人推荐使用$()
因为``
不太好识别,容易看错,虽然二者功效相同
a=$("echo "hello world!" | awk 'NR==1');
a=`echo "hello world!" | awk 'NR==1'`;
各类括号的区别
由于 shell 中各种类型的括号规则又多又杂,限于篇幅,这里不做特别详细讲解,详细的讲解请看博主整理的这篇博文:
主要记住[]
和[[]]
通常来做字符串比较,(())
做数字比较且支持 c 语言风格,[[]]
在[]
基础上加了扩展功能,且中括号要注意空格问题