有几种方法可以在相同的脚本bash
上执行不同的命令。cmd
cmd
将忽略以 开头的行:;
,如其他答案中所述。如果当前行以命令结尾,它也会忽略下一行rem ^
,因为^
字符将转义换行符,下一行将被视为注释rem
。
至于bash
忽略cmd
线条,有多种方法。我列举了一些在不破坏 cmd
命令的情况下做到这一点的方法:
不存在的#
命令(不推荐)
如果脚本运行时没有#
可用cmd
的命令,我们可以这样做:
# 2>nul & echo Hello cmd! & rem ^
echo 'Hello bash!' #
行首的#
字符cmd
使bash
该行视为注释。
正如 Brian Tompsett 在他的回答中指出的那样,#
该行末尾的字符用于bash
注释该字符。没有这个,如果文件有.\r
bash
\r\n
cmd
通过这样做# 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
.