沨鸾的Shell小技巧
跟着沨鸾学shell,学到最后只会喵喵喵。
正经部分:
语法规范:
变量要加{}括起来。
函数最好加个function关键字。
头部一定要有释伴(shebang)。
记得写注释,要不然也就上帝能看懂你写的什么了。
退出时要有返回状态。
能用[[]]就别用[]。
尽量用printf代替echo使用以提供更好的兼容性。
没用的输出记得丢弃。
> /dev/null丢不掉就2>&1 > /dev/null。
不要定义太复杂的架构,比如函数互相调用。
当然咱基本没怎么遵守过。
三元表达式:
比如你想要这样一段的功能:
1 | if [[ $x == 1 ]];then |
你可以这么写:
1 | ([[ $x == 1 ]]&&echo test)||echo fail |
测试一下:
1 | x=0 |
等下语法规范呢?
遵守是不可能遵守的了。。。
三元表达式plus:
比如你想要这一段的功能:
1 | if [[ $x == 1 ]];then |
你可以写成这样:
1 | ([[ $x == 1 ]]&&echo 1)||([[ $x == 2 ]]&&echo 2)||echo fail |
看你写的代码的人会感谢你的。
批量操作:
比如我们要下载一堆链接,却不想每次都敲命令剩下的部分,可以:
1 | while read i |
所以作者到底在下载什么。。。
获取随机值:
我们在使用$RANDOM
做文件名时会遇到一个问题:值太短,不够幸运的话可能还是有冲突。
这里我们可以加一个$(date +%s)
来解决。
最高端的输出颜色自定义:
使用rgb代码定义输出颜色。
1 | \033[1;38;2;R;G;Bm |
比如moe-container里的这行:
1 | printf("\033[1;38;2;254;228;208mUsage:\n"); |
当然这是C语言。
等下这是shell技巧……对吧。
输出居中:
首先你得知道要居中的输出有多长。
然后:
1 | WIDTH=$(($(($(stty size|awk '{print $2}')))/2-居中字符长度的一半)) |
除了花哨点也没啥大用。
输出一行分割线:
1 | WIDTH=$(stty size|awk '{print $2}') |
当然可以玩的更花哨一点:
1 | WIDTH=$(stty size|awk '{print $2}') |
$WIDTH定义参照上一条。
或者像termux-container里这样:
1 | WIDTH=$(stty size|awk '{print $2}') |
莫名科技感。
sed正则匹配:
1 | echo 123abc > test |
正则表达式具体内容请自行利用搜索引擎。
想当年咱要是会用,termux-container里的屎山也能少点。
更改光标样式:
1 | printf '\e[2 q' |
仅在termux验证成功过。
Ctrl+D信号捕获:
不是说好EOF不是信号的吗?
事实上read可以捕获。
read无论读到什么东西加回车都会将结果记录并正常退出。
但是,读到EOF却未换行会返回1。
可以read后用$?的值是否为0来作为条件进行捕获。
当然read逐字读取时不适用,但是我们还有方法专门针对逐字读取:
1 | while :; do read -N 1 key&&if [[ ${key} == $(printf "\004") ]];then echo CTRL-D;fi; done |
似乎挺没用的。
网易云歌曲名称格式化:
网易云默认下载的音乐命名格式是这样的:
1 | Akie秋绘 - なんでもないや 没什么大不了的(翻自 Radwimps).mp3 |
(浓度过纯)
咱们可以这样:
1 | ls *.mp3|while read music |
于是文件名就成了这样:
1 | なんでもないや 没什么大不了的-[Akie秋绘].mp3 |
个人感觉好看多了。
萌新代码生成:
1 | x(){ |
逝python,但是运行会直接内存错误。
生草部分:
变量当函数/命令名执行:
1 | test(){ |
不做类型检查你就可以为所欲为了是吧。
忽略Ctrl+C:
用户别想用Ctrl+C杀死你的进程(大草)。
1 | trap "" SIGINT |