Bash 命令转义引号

Bash command escaping quotes

我有以下 bash 片段:

#as long as we read invalid stuff prompt the user
REPLY=
until [[ $REPLY =~ ^[YyNn]$ ]]; do
    read -p "Want to generate an Eclipse CDT4 Project? [y/n]" -n 1 -r
    echo    # (optional) move to a new line
done

PROJARGS=
if [[ $REPLY =~ ^[Yy]$ ]]
then
     PROJARGS='-G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE'
fi

cmake $PROJARGS -D CMAKE_BUILD_TYPE=$BUILD_TYPE ../src

基本上,我想在用户点击 y 时设置额外的 $PROJARGS 参数。

但是,最后一个端口不起作用,因为插入了一些引号,我不想在那里。使用 set -x 我发现发生了以下情况:

+ PROJARGS='-G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE'
+ cmake -G '"Eclipse' CDT4 - Unix 'Makefiles"' -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE -D CMAKE_BUILD_TYPE=Release ../src
CMake Error: Could not create named generator "Eclipse

因此插入了额外的引号。我不知道为什么。我该如何防止这种情况?

不要将您的参数放入字符串中!使用数组!

projargs=()
if [[ $REPLY = [Yy] ]]; then
    projargs=( -G "Eclipse CDT4 - Unix Makefiles" -DCMAKE_ECLIPSE_GENERATE_SOURCE_PROJECT=TRUE )
fi

(注意我将你的变量小写了,因为大写变量名在 shell 编程中被认为是不好的做法!)。

然后用作:

cmake "${projargs[@]}" -D CMAKE_BUILD_TYPE="$BUILD_TYPE" ../src

(注意引号)。

作为旁注,您在这里不需要正则表达式。一个 glob 就够了:

until [[ $REPLY = [YyNn] ]]; do ...

BashFAQ/050 中的更多信息和良好做法。