Shell命令中单引号,双引号,反引号的区别

问题

  在Linux系统下调用shell命令时经常会忽略双引号和单引号的区别,一般情况下都不会出错。但是当遇到一些特殊符号时,会出现预想不到的情况。比如我会经常使用echo -e “password\npassword” | passwd root 这条命令修改root密码时出现了异常情况, 由于密码是随机生成的, 有一次密码里面包含了符号 “$”,在shell中$可以用来引用变量, 当变量不存在时就表示空, 于是就出现这样的情况,密码"abc$def" 变成了"abc",用echo可以看到,打印出来的只有"abc", 原因就是因为shell将$def解释成了对变量的引用。

$ echo -e "abc$def\nabc$def"
abc
abc

单引号 ‘’

  所见即所得,即输出时会将单引号内的所有内容都原样输出,或者描述为单引号里面看到的什么就输出什么,称为强引用。

$ echo -e 'abc$def\nabc$def\\'
abc$def
abc$def\
$ echo 'abc$def\nabc$def\\'
abc$def\nabc$def\\

这里的 -e 激活了echo的转义,所以\n, \都转义了,去掉-e之后输出原文

双引号 “”

  输出双引号的所有内容;如果内容中有命令(要反引)、变量、特殊转义,会先把变量、命令、转义字符解析出结果,然后在输出最终内容,这称为弱引。

$ echo  "abc$def\nabc$def"
abc\nabc
$ echo  "abc$def\nabc$def\\"
abc\nabc\
$ echo  "abc\$def\nabc\$def"
abc$def\nabc$def

  可以看到若想在双引号中输出特殊符号, 可以用\来转义,双引号中\,\的效果是一样的。 而且\n在双引号中不算特殊字符, 不会当作换行处理。

反引号 ``

  一般用于命令,执行的时候命令会被执行,相当于$(),赋值和输出都要用反引号引起来。

$ echo `date`
20210220日 星期六 18:18:01 CST

  先执行date, 在执行echo

猜你喜欢

转载自blog.csdn.net/weixin_43749427/article/details/113888375