【问题标题】:In shell scripting, what's the difference between $i, %i and %%i?在 shell 脚本中,$i、%i 和 %%i 有什么区别?
【发布时间】:2019-04-24 16:03:57
【问题描述】:

我试图在一堆文件的文件名前添加一个字符串。我阅读了几个问题,他们都为基本相同的命令推荐了不同的语法,只有一个有效。

我使用cmder 作为我的控制台。我试图将 crypto- 添加到 CWD 中的所有文件中,这就是我尝试过的:

This answer 推荐如下语法:

for i in *.png ; do mv "$i" "crypto-$i" ; done

此时我出乎意料。


This answer 推荐双百分号%%i

for %%i in *.png ; do mv "$i" "crypto-$i" ; done

%%i 出乎意料。


This answer 建议 i 使用单个百分号而不是美元符号:

for %i in *.png ; do mv "$i" "crypto-$i" ; done

*.png 在此时出乎意料。

这次我走得更远,注意到在答案中,文件名用括号括起来,所以我尝试了:

for %i in (*.png) ; do mv "$i" "crypto-$i" ; done

mv "$i" "crypto-$i" ;完成
mv: 目标“完成”不是目录

然后我想该命令也应该放在括号中:

for %i in (*.png) ; do (mv "$i" "crypto-$i") ; done

此时完成是出乎意料的。

在那之后,我决定不使用;

for %i in (*.png) do (mv "$i" "crypto-$i")

(mv "$i" "crypto-$i" )
mv: cannot stat '$i': 没有这样的文件或目录

最后,我想既然我第一次用%来指代i,我应该稍后再用%并尝试:

for %i in (*.png) do (mv "%i" "crypto-%i")

此变体有效,所有文件都已成功重命名。


我的问题是 - 为什么最后一个命令有效而其他命令无效?为什么有这么多不同的语法似乎只在某些情况下有效?那些场合是什么?为什么有时加括号有时不加括号?为什么有时加分号有时不加分号? $i%i%%i有什么区别?

【问题讨论】:

  • 您指的答案似乎是关于 Bash,而您似乎没有使用 Bash。
  • 其中几个(%i%%i(*.png))根本不与/for/relevant-to POSIX 兼容的 shell。您将 Windows cmd.exe 语法与 UNIX-shell 语法混合在一起。
  • 请务必检查问题标记。除非添加了更具体的标签,否则仅标记为 shell 的问题应该与 POSIX 系列 shell 有关。有关 Windows cmd.exe 的问题应标记为cmd。您不能期望将标记为 cmdbatch 的问题的答案应用于任何 UNIX-y shell。
  • cmder 只是一个控制台/终端模拟器。你需要知道里面运行的是什么。
  • lsmv 不是 bash 命令,它们是程序。显然你已经安装了这些的 Windows 版本。 “shell 或 bash”是什么意思? Bash 是一个外壳。

标签: shell command-line cmder


【解决方案1】:

语法取决于您使用的 shell。由于cmder有bash,我虽然我使用的是bash。相反,它是 cmd。

此外,您可以在 CLI 中运行的程序并不取决于它使用的 shell 类型。只要您安装了lsmv 和所有其他"bash" programs,您就可以运行它们。

我认为你可以在 CMD 中运行“Windows 程序”,在 Bash 中运行“Unix 程序”。我认为外壳与它们最常用的程序耦合在一起。事实并非如此。

所以回答这个问题:

i$ibash 的语法:

for i in *; do echo $i; done

根据this answer%icmd的语法:

for /l %x in (1, 1, 100) do echo %x

...%%i 是批处理文件中命令的语法:

for /l %%x in (1, 1, 100) do echo %%x

旁注:“shell”不是命令行解释器。这是命令行解释器的词。 Bash 和 CMD shell。

所以澄清一下:

  • shell 是用于访问操作系统服务的用户界面。它可以是命令行界面 (CLI) 或图形用户界面 (GUI)。 CLI shell(bash、cmd)允许您通过命令与您的机器进行交互。 GUI shell(例如,Windows 上的文件资源管理器、macOS 上的 Finder)允许您通过鼠标和其他外围设备与您的计算机进行交互。

  • cmder 是一个控制台模拟器,附带 Unix 工具(程序),如 lsmv 等。它运行 CLI shell 并可以执行它附带的 Unix 工具。

  • bash 为 GNU 项目制作的 CLI shell。

  • cmd 为 Windows 制作的 CLI shell。

  • cmder 可以模拟 bash、cmd 或 PowerShell,它们都是 shell。

【讨论】:

    猜你喜欢
    • 2017-10-23
    • 2011-03-21
    • 2021-08-25
    • 2021-12-30
    相关资源
    最近更新 更多