Bash命令转义引号

时间:2015-02-21 16:00:23

标签: 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 =~ ^[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

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

1 个答案:

答案 0 :(得分:1)

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

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中的更多信息和良好做法。