Shell - 写一个执行C/C++的快捷脚本
学习shell已经有一周了,开发环境从vscode换到了Xshell上,以前不可一世的图形界面也变成了小黑窗,虽然有些失落,但对我也是重要的锻炼,得以让我体验早期程序员,也可能是以后C++开发的大致日常。
我有很多问题要靠自己解决,在学习了shell脚本后,我第一个想法就是写个脚本来简化编译运行C的过程,免得编写完一次就要写一长串的gcc, g++让自己犯烦。
单文件编译版本, 支持C/C++
#!/bin/bash
file=$1
# 去掉文件的扩展名,只剩下文件名
filename=$(echo "$1" | cut -f 1 -d '.')
if [ -z $1 ]
then
echo "no file appointed!"
exit 1
fi
echo compiling $file
echo output name: $filename
# 11.6.2 双方括号可用于字符串的高级处理
if [[ $file=="*.cpp" ]]
then
g++ "$file" -o $filename
./$filename
elif [[ $file=="*.c" ]]
then
gcc "$file" -o $filename
./$filename
else
echo "invaild file!"
fi
测试:
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# sh autorun.sh
no file appointed!
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# sh autorun.sh test1.c
compiling test1.c
output name: test1
I'm test1 file
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# sh autorun.sh test2.c
compiling test2.c
output name: test2
THIS IS TEST2 FILE
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# sh autorun.sh testinp.cpp
compiling testinp.cpp
output name: testinp
input a number:50
number is :50[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]#
升级为全局命令
vim 打开 root/.bashrc
文件夹
然后在其中写入alias cppr=sh /path/to/autorun.sh
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
export NVM_DIR="/www/server/nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion
alias cppr='sh ~/myScripts/autorun.sh'
以后就能直接cppr指令来执行c/c++文件了,舒服。
测试一下:
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# cppr
no file appointed!
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# cppr test1.c
compiling test1.c
output name: test1
I'm test1 file
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# cppr test2.c
compiling test2.c
output name: test2
THIS IS TEST2 FILE
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# cppr testinp.cpp
compiling testinp.cpp
output name: testinp
input a number:
46
number is :
46[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]#
问题记录
分辨文件类型
根据目前所学知识可以用if [[ expr ]]
的方式完成,根据《Linux命令行与Shell编程》11.6.2 ,双方括号可用于字符串的高级处理。
将文件名的扩展名排除
脚本不仅得能够分辨c和cpp文件,还得把文件名的扩展名去掉,stackoverflows上一搜找到一个cut的指令:
# -d 用于设置分割符 -f 用于指定选择打印的字段,这里以分隔符为界分离出了trun和exe两个字段
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# echo "trun.exe"|cut -f2 -d'.'
exe
[root@iZbp13zqzr3c74v3o1ry3mZ 13_userInput]# echo "trun.exe"|cut -f1 -d'.'
trun