gpt4 book ai didi

macos - bash中的 ` and '有什么区别?

转载 作者:行者123 更新时间:2023-11-29 09:18:12 24 4
gpt4 key购买 nike

在 OS X 终端中运行这条语句

for i in `ls -v *.mkv`; do echo $i; done

将按名称顺序成功打印出目录中的所有文件名,每个文件名各占一行。

来源:This StackOverFlow answer

但是,如果我在 OS X 终端中运行这条语句

for i in 'ls -v *.mkv'; do echo $i; done

输出是“ls -v fileName1.mkv fileName2.mkv”等,所有文件名连接成一长行(而不是每个都打印在自己的行上)。

我的问题是:

  1. bash 中的 ` 和 ' 有什么区别?
  2. 为什么这种差异会导致完全不同的输出?
  3. 什么键盘组合产生`? (键盘组合)

最佳答案

1) 反引号 之间的文本被执行并替换为封闭命令的输出,因此:

echo `echo 42`

将扩展为:

echo 42

这叫做 Command Substitution也可以使用语法 $(command) 来实现。在您的情况下,以下内容:

for i in `ls -v *.mkv`; do ...

替换为类似的东西(如果您的目录包含 3 个名为 a.mkvb.mkvc.mkv 的文件):

for i in a.mkv  b.mkv  c.mkv; do ...

引号双引号 之间的文本只是普通的 Bash 字符串,其中包含像 space 这样的字符(还有其他方式来引用字符串在 Bash 中是 described here ):

echo "This is just a plain and simple String" 
echo 'and this is another string'

使用 '" 的区别在于 " 之间的字符串可以 interpolate变量,例如:

variable=42
echo "Your value is $variable"

或者:

variable=42
echo "Your value is ${variable}"

打印:

Your value is 42

2)*.mkv 这样的通配符表达式在称为 Globbing 的过程中被扩展文件名替换.通配符在大多数命令中使用通配符激活,没有将表达式括在字符串中:

echo *.mkv

将打印:

a.mkv b.mkv c.mkv

同时:

echo "*.mkv"

打印:

*.mkv

for 循环中的 i 变量采用值“ls -v *.mkv”,但 echo 循环体内的命令采用不带引号的 $i ,因此 Bash 在那里应用了 globbing,你最终得到以下内容:

for i in 'ls -v *.mkv'; do 
# echo $i
#
# which is expanded to:
# echo ls -v *.mkv (no quotes)
#
# and the globbing process transform the above into:
echo ls -v a.mkv b.mkv c.mkv

这只是应用 globbing 后的文件名的单行字符串。


3) 这取决于您的键盘布局。

保留字符的一个技巧是使用程序 ascii,搜索字符 96(十六进制 60),将其复制并保存在剪贴板上(您可以使用 parcellite 或任何其他适合您需要的剪贴板管理器)。


更新:根据 @triplee 的建议, 你应该检查 useless use of ls因为这被认为是 bash pitfall并且有更好的方法来实现您想要做的事情。

关于macos - bash中的 ` and '有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com