玩转shell-shell编程中那些易混淆的知识点大汇总!


在这里插入图片描述

${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; 	

echoprintf的区别

echoprintf都可以用来输出文本值,但是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 -lll命令的区别

二者效果没有区别,都是详细显示当前文件夹下的文件(不包括隐藏文件),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 中各种类型的括号规则又多又杂,限于篇幅,这里不做特别详细讲解,详细的讲解请看博主整理的这篇博文:

玩转shell-那些反人类的括号使用规则大汇总!

主要记住[][[]]通常来做字符串比较,(())做数字比较且支持 c 语言风格,[[]][]基础上加了扩展功能,且中括号要注意空格问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcnull

您的打赏是我创作的动力之一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值