有几种方法可以在相同的脚本bash上执行不同的命令。cmd
cmd将忽略以 开头的行:;,如其他答案中所述。如果当前行以命令结尾,它也会忽略下一行rem ^,因为^字符将转义换行符,下一行将被视为注释rem。
至于bash忽略cmd线条,有多种方法。我列举了一些在不破坏 cmd命令的情况下做到这一点的方法:
不存在的#命令(不推荐)
如果脚本运行时没有#可用cmd的命令,我们可以这样做:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
行首的#字符cmd使bash该行视为注释。
正如 Brian Tompsett 在他的回答中指出的那样,#该行末尾的字符用于bash注释该字符。没有这个,如果文件有.\rbash\r\ncmd
通过这样做# 2>nul,我们可以cmd忽略一些不存在#的命令的错误,同时仍然执行后面的命令。
如果 上有#可用的命令,PATH或者您无法控制cmd.
用于echo忽略上的#字符cmd
我们可以将echo它的输出重定向到在注释掉的区域插入cmd命令:bash
echo >/dev/null # >nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
由于#字符在 上没有特殊含义cmd,因此被视为文本的一部分echo。我们所要做的就是重定向echo命令的输出并在其后插入其他命令。
空#.bat文件
echo >/dev/null # 1>nul 2> #.bat
# & echo Hello cmd! & del #.bat & rem ^
echo 'Hello bash!' #
该echo >/dev/null # 1>nul 2> #.bat行在 on 时创建一个空#.bat文件cmd(或替换现有的#.bat,如果有的话),并且在 on 时不执行任何操作bash。
这个文件将被后面的行使用cmd,即使.#PATH
- 特定代码上的del #.bat命令cmd删除创建的文件。您只需在最后cmd一行执行此操作。
#.bat如果文件可能位于您当前的工作目录中,请不要使用此解决方案,因为该文件将被删除。
:; echo 'Hello bash!';<<:
echo Hello cmd! & ^
:
通过将^字符放在行尾,cmd我们将转义换行符,并且通过使用:here-document 分隔符,分隔符行内容对cmd. 这样,cmd只会在行结束后执行其行:,具有与bash.
如果你想在两个平台上都有多行并且只在块的末尾执行它们,你可以这样做:
:;( #
:; echo 'Hello' #
:; echo 'bash!' #
:; );<<'here-document delimiter'
(
echo Hello
echo cmd!
) & rem ^
here-document delimiter
只要没有cmd与完全一致here-document delimiter,这个解决方案就应该有效。您可以更改here-document delimiter为任何其他文本。
在所有提出的解决方案中,命令只会在最后一行之后执行,如果它们在两个平台上执行相同的操作,它们的行为就会保持一致。
这些解决方案必须保存到带有\r\n换行符的文件中,否则它们将无法在cmd.