扩展变量和打印变量(如echo
或printf
)之间有什么区别?
如果我理解正确的话,打印一个变量(它的值)只是一个例子扩大它。或许替换它的值也是一个例子。
更新
请给出“变量扩展”一词的简短定义用你自己的话来说,就在解释差异之前。
答案1
扩展和打印是两个不同的操作。扩建涵盖了shell 处理命令的阶段数:在 Bash 中,大括号扩展({1..5}
变为1 2 3 4 5
)、波形符扩展(~user
变为/home/user
适当的)、shell 参数扩展(${variable}
替换为变量的值)、命令替换、算术扩展、进程替换、分词和文件名扩展。 (也可以看看POSIX 字扩展.)
对所有这些使用术语扩展的一种可能的解释是它们都可以导致命令扩展,IE变得更长(这是在 C 语言中开发 shell 时需要特别关注的问题)。
在您的情况下,扩展是参数扩展:
echo "${variable}"
变成
echo "value"
在您所说的变量替换之后,然后
echo value
删除引号(稍微简化)后,然后echo
进行打印。正好echo
和printf
是 shell 内置的,所以只涉及 shell,但步骤是分开的,情况与外部命令相同。
因此,印刷并不是扩张的特例;而是扩张的特例。但是,替换(如您链接的问题中所示)是,请参阅bash手册了解详情。
答案2
当我们查看 shell 的功能时,例如:
- 等待用户输入
- 解释用户输入
- 根据用户输入进行操作
- 与其他程序/进程通信
当然,还有
- 将数据打印到屏幕上
...实际上是到航站楼。不管怎样,shell 会采取行动,以便用户可以查看数据。
shell 所做的就是扩展变量当它解释用户的输入时。 shell 识别出用户对变量进行了引用,并继续解释用户的输入,就好像用户输入包含变量的内容而不是引用一样。例如,假设有一个FOO
存储值 的变量bar
。用户键入语句echo $FOO
。 shell 开始解释该语句,将其识别$FOO
为对指定变量的引用FOO
,并继续解释该语句,就像用户键入了该语句一样echo bar
。
打印变量是投影其内容以一种让用户感知(即阅读)的方式。它正在执行处理存储在变量中的值的实际任务,以便将其传输给用户。在 的示例中echo $FOO
,变量FOO
首先被扩展,然后,作为扩展的结果,echo
例程将 的内容打印FOO
到屏幕上。
从某种意义上说,打印值与扩展变量相反。当变量被扩展时shell正在读取数据,以确定要做什么。当打印一个变量时,shell 正在分发数据,给用户。
答案3
简单来说,扩展变量会替换其值,该变量可以用作任何 shell 命令或脚本的一部分。
echo
和printf
是导致字符串打印到标准输出(通常是屏幕)的特定命令。该字符串可以是扩展的 shell 变量,也可以是字符串文字或另一个命令或命令集的输出。
所以,您可以看到,它们是完全不同的:您可以扩展变量而不打印它,或者您可以打印不是扩展变量的内容。
答案4
shell 在执行受影响的命令之前执行变量扩展。这与命令无关,可能是命令echo
,printf
也可能是其他命令。
例如:
param='-ltr'
ls $param
扩展到
ls -ltr
这是正在执行的命令。