Bash命令转义引号

Bash命令转义引号,bash,escaping,Bash,Escaping,我有以下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 =~

我有以下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
(注意引号)

作为旁注,这里不需要正则表达式。一个地球仪就足够了:

until [[ $REPLY = [YyNn] ]]; do ...
更多信息和良好实践