Shell - 脚本实现控制台一键编译运行 C++ 代码
前言
由于電腦內(nèi)存不足將 Clion 給卸載了,現(xiàn)在只能用 Vim 來編寫 C++ 代碼了。但是每次寫完代碼之后都需要經(jīng)過「編譯g++ test.cpp」和「執(zhí)行./a.out」兩步操作,感覺用起來比較繁瑣。于是,我有了用 Shell 將這兩條命令合成一個腳本簡化執(zhí)行的想法。
文中腳本執(zhí)行環(huán)境:
- macOS Catalina 10.15.4
- iTerm2
PS:本文適合不懂 Shell 編程的同學(xué),腳本大佬請繞道orz。
1. 命令串聯(lián)執(zhí)行
首先,我們先要將g++ test.cpp 和 ./a.out 這兩行命令都放到腳本中。Shell 腳本可以直接執(zhí)行我們?nèi)粘懺诿钚兄械拿?#xff0c;不需要額外的語法,比較方便。
于是就有了如下的第一版 Shell 腳本 ex.sh:
#! /bin/sh echo "Script Start" g++ test.cpp; ./a.out; echo "Script End"通過 sh ex.sh 命令執(zhí)行腳本,可以得到如下輸出,可見能它能基本完成我們的需求。
Script Start Hello World Script EndPS:test.cpp 是個簡單的 HelloWorld 程序。
2. 建立命令之間的關(guān)聯(lián)性
上面的初版腳本還有優(yōu)化空間,例如在 C++ 代碼編譯失敗后,上面腳本還是會去運行上次編程成功的程序,而我們希望 C++ 代碼編譯失敗后不再去運行程序。這就需要我們建立命令之間的關(guān)聯(lián)性。
這里介紹三個非常常用的分隔符:
-
分隔符;:這條命令的執(zhí)行結(jié)果不會影響下一條命令的執(zhí)行,它可以讓各條命令獨立執(zhí)行,但不保證所有命令都執(zhí)行成功。
-
分隔符&&:前面的命令執(zhí)行成功,才會去執(zhí)行后面的命令,它可以保證各條命令執(zhí)行完畢時,所有命令都是執(zhí)行成功的。
-
分隔符||:前面的命令執(zhí)行失敗,才會去執(zhí)行后面的命令。
基本上面這些分隔符的應(yīng)用,有了如下的第二版的 Shell 腳本:
#! /bin/sh echo "Script Start" g++ test.cpp && ./a.out echo "Script End"PS:經(jīng)過實驗發(fā)現(xiàn),第一版去掉;分隔符也可達到相同效果(捂臉 )
3. 接收傳入腳本的參數(shù)
雖然功能上是沒有問題了,但是 C++ 文件名是寫死,每次運行都需要修改,非常不方便。我們希望在運行腳本的時候傳遞 C++ 代碼的文件名,于是需要引入腳本的參數(shù)傳遞。
在觀摩了「菜鳥教程 - Shell 傳遞參數(shù)」文章后,總結(jié)出了以下重點:
- 我們可以在執(zhí)行 Shell 腳本時,向腳本傳遞參數(shù)。例如,執(zhí)行sh ex.sh param, param 為傳入腳本的參數(shù);
- 腳本內(nèi)獲取參數(shù)的格式為:$n。n 代表一個數(shù)字,1 為執(zhí)行腳本的第一個參數(shù),2 為執(zhí)行腳本的第二個參數(shù),以此類推……
- 其中 $0 為當(dāng)前執(zhí)行的腳本文件名。
還有幾個常用的特殊字符用來處理參數(shù):
- $#:傳遞到腳本的參數(shù)個數(shù)。
- $*:以一個單字符串顯示所有向腳本傳遞的參數(shù)。
- $@:與$*相同,但是使用時加引號,能在引號中返回每個參數(shù)。
我們可以用下面例子理解 $* 和 $@ 的區(qū)別:
假如我們給腳本傳入了參數(shù) param1 param2 param3
- 用"$*" 得到的是 "param1 param2 param3",包含所有參數(shù)的一個字符串。
- 用"$@" 得到的是 "param1" "param2" "param3",包含三個對應(yīng)參數(shù)字符串元素的數(shù)組。
于是就得到了我們的最終版腳本:
#! /bin/sh# 輸出參數(shù)個數(shù) echo "The number of params: $#"# 輸出腳本名 echo "The filename of shell: $0"# 輸出傳入腳本的參數(shù) for i in "$@" doecho "$i" done# 編譯、運行指定名稱的C++代碼 g++ $1.cpp && ./a.out通過 sh ex.sh test 就能完成對 test.cpp 的編譯和運行,是不是方便了不少呢?(其實并沒有 )
參考資料
- https://www.runoob.com/linux/linux-shell.html
- https://blog.csdn.net/craftsman2020/article/details/107850685
總結(jié)
以上是生活随笔為你收集整理的Shell - 脚本实现控制台一键编译运行 C++ 代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS - NSUserDefaults
- 下一篇: 解决 VSCode 编写 C++11 代