我有以下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
所以插入了额外的引号。我不知道为什么。我如何防止这种情况?
答案 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中的更多信息和良好做法。