如何操纵两个可能的参数?

如何操纵两个可能的参数?

我使用自定义脚本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/

相关内容