bash和sh的调用线路行为不同

bash和sh的调用线路行为不同,bash,syntax,Bash,Syntax,运行命令时 cmake ../../ -DCMAKE_C_FLAGS="-DFOO -DBAR ${CMAKE_C_FLAGS}" 在bash中,它工作得很好 通过脚本时,它会失败: ./myscript "-DFOO -DBAR" cmake ../../ -DCMAKE_C_FLAGS="-DFOO -DBAR ${CMAKE_C_FLAGS}" Parse error in command line argument: -DBAR myscript: #!/bin/bash cmak

运行命令时

cmake ../../ -DCMAKE_C_FLAGS="-DFOO -DBAR ${CMAKE_C_FLAGS}"
在bash中,它工作得很好

通过脚本时,它会失败:

./myscript "-DFOO -DBAR"

cmake ../../ -DCMAKE_C_FLAGS="-DFOO -DBAR ${CMAKE_C_FLAGS}"
Parse error in command line argument: -DBAR
myscript:

#!/bin/bash
cmake_options='-DCMAKE_C_FLAGS="'$1' ${CMAKE_C_FLAGS}"'
echo "cmake ../../ "$cmake_options
cmake ../../ $cmake_options
我知道这一定与转义字符有关,所以我尽我所能(双引号/单引号、反引号、转义反斜杠、使用$()等),但找不到修复方法

我不是linux专家,有人能帮我吗

PS:我正在研究cygwin,但我也在普通的Linux上进行了测试,其行为是相同的

编辑:


@如前所述,我已经尝试了很多方法,但将$1改为“$1”并不能解决问题。我所说的“bash”是直接在命令提示符中,而“sh”是指“myscript.sh”文件。我确实有一个/bin/bash,我只是不知道它叫shebang。我还尝试引用$cmake_选项,但没有结果。

使用此脚本:

#!/bin/bash
cmake_options=-DCMAKE_C_FLAGS="\"$1 \${CMAKE_C_FLAGS}\""
echo "cmake ../../ "$cmake_options
cmake ../../ "$cmake_options"

您可能应该这样引用
$1
开始:
“$1”
同样,在脚本中,您运行的是文件夹
。/../../
中的
cmake
命令,而在bash命令中,您运行的是文件夹
。/../../Sources
中的
bash
sh
之间的区别是什么?
sh
在脚本的shebang中吗?
sh
与直接调用脚本无关。在脚本文件的开头有特殊的一行吗?如果没有,请将以下代码作为脚本的第一行:
#/usr/bin/env bash
。这被称为shebang,它向linux指定要使用哪个解释器(在这里,它强制使用
bash
),而且当变量中有空格时,引用它们通常是至关重要的。尝试在脚本中的任何地方引用
$cmake_options
作为
“$cmake_options”