我使用自定义脚本ccc
来编译.c
如下文件:
g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o "${1%%.c}.out" -lm "$1"
基本上我使用ccc main.c
然后main.out
出来。现在我也想.cpp
使用完全相同的脚本编译文件。到目前为止我有这个:
#!/bin/bash
if [ "$1" == "*.cpp" ]; then
g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o "${1%%.cpp}.out" -lm "$1"
echo "g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o ${1%%}.out -lm $1"
elif [ "$1" == "*.c" ]; then
g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o "${1%%.c}.out" -lm "$1"
echo "g++ -std=c++11 -Wall -pedantic -Wno-long-long -Wshadow -g -o ${1%%}.out -lm $1"
else
echo "Error - file does not exist or wrong type"
fi
但是,现在.cpp
和.c
文件都无法编译,并且我的 errmsg 被回显。我犯了什么错误?
答案1
您的 if 测试不会检查 *.c 和 *.cpp 文件,而是检查参数是否确实是“*.cpp”或“*.c”。
尝试以下方法来查看触发的条件:
ccc "*.cpp"
ccc "*.c"
基于这个帖子,我看到你可以通过删除“*.cpp”周围的引号并添加一对额外的括号来获得你想要的行为:
if [[ "$1" == *.cpp ]]; then
答案2
您的比较运算符并没有按照您想象的那样进行匹配。
当您检查=="*.c"
或=="*.cpp"
它正在检查它是否与实际字符串匹配。
你想要的是正则表达式比较。
if [[ $1 =~ $regex ]]; then
对于实际的正则表达式,字符^
表示“以...开头”,$
表示“以...结尾”,因此
if [[ $1 =~ ^[a-zA-Z0-9]*\.cpp$ ]]; then
可能是检查 cpp 文件的一个好开始
if [[ $1 =~ ^[a-zA-Z0-9]*\.c$ ]]; then
对于 c 文件。
我强烈建议任何系统管理员(尤其是在 *nix 系统上)或从事任何类型的脚本/编程/开发的人掌握一项技能,那就是学习使用正则表达式。目前有相当多的教程和速查表,这是我收藏的书签中的第一个 -https://www.maketecheasier.com/regular-expressions-cheat-sheet/