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