首页 > 系统相关 >沨鸾的Shell小技巧

沨鸾的Shell小技巧

时间:2024-11-01 15:30:47浏览次数:5  
标签:Shell 技巧 read print echo WIDTH mp3 test

跟着沨鸾学shell,学到最后只会喵喵喵。

正经部分:

语法规范:

变量要加{}括起来。
函数最好加个function关键字。
头部一定要有释伴(shebang)。
记得写注释,要不然也就上帝能看懂你写的什么了。
退出时要有返回状态。
能用[[]]就别用[]。
尽量用printf代替echo使用以提供更好的兼容性。
没用的输出记得丢弃。
> /dev/null丢不掉就2>&1 > /dev/null。
不要定义太复杂的架构,比如函数互相调用。
当然咱基本没怎么遵守过。

三元表达式:

比如你想要这样一段的功能:

if [[ $x == 1 ]];then
  echo test
else
  echo fail
fi

你可以这么写:

([[ $x == 1 ]]&&echo test)||echo fail

测试一下:

x=0
([[ $x == 1 ]]&&echo test)||echo fail
x=1
([[ $x == 1 ]]&&echo test)||echo fail

等下语法规范呢?
遵守是不可能遵守的了。。。

三元表达式plus:

比如你想要这一段的功能:

if [[ $x == 1 ]];then
  echo 1
elif [[ $x == 2 ]];then
  echo 2
else
  echo fail
fi

你可以写成这样:

([[ $x == 1 ]]&&echo 1)||([[ $x == 2 ]]&&echo 2)||echo fail

看你写的代码的人会感谢你的。

批量操作:

比如我们要下载一堆链接,却不想每次都敲命令剩下的部分,可以:

while read i
do
aria2c -x16 -c $i
done

所以作者到底在下载什么。。。

获取随机值:

我们在使用$RANDOM做文件名时会遇到一个问题:值太短,不够幸运的话可能还是有冲突。
这里我们可以加一个$(date +%s)来解决。

最高端的输出颜色自定义:

使用rgb代码定义输出颜色。

\033[1;38;2;R;G;Bm

比如moe-container里的这行:

printf("\033[1;38;2;254;228;208mUsage:\n");

当然这是C语言。
等下这是shell技巧……对吧。

输出居中:

首先你得知道要居中的输出有多长。
然后:

WIDTH=$(($(($(stty size|awk '{print $2}')))/2-居中字符长度的一半))
echo -e "\033[${WIDTH}C内容"

除了花哨点也没啥大用。

输出一行分割线:

WIDTH=$(stty size|awk '{print $2}')
echo $(yes "="|sed $WIDTH'q'|tr -d '\n')

当然可以玩的更花哨一点:

WIDTH=$(stty size|awk '{print $2}')
WIDTH=$((WIDTH/2-2))
echo "$(yes "="|sed $WIDTH'q'|tr -d '\n')xxxx$(yes "="|sed $WIDTH'q'|tr -d '\n')"

$WIDTH定义参照上一条。
或者像termux-container里这样:

WIDTH=$(stty size|awk '{print $2}')
WIDTH=$((WIDTH-13))
echo -e "\e[30;48;5;159mCONTAINER_RUN$(yes " "|sed $WIDTH'q'|tr -d '\n')\033[0m"

莫名科技感。

sed正则匹配:

echo 123abc > test
sed -i "s/[0-9]*/数字替换/" test
cat test

正则表达式具体内容请自行利用搜索引擎。
想当年咱要是会用,termux-container里的屎山也能少点。

更改光标样式:

printf '\e[2 q'
printf '\e[6 q'
printf '\e[4 q'

仅在termux验证成功过。

Ctrl+D信号捕获:

不是说好EOF不是信号的吗?
事实上read可以捕获。
read无论读到什么东西加回车都会将结果记录并正常退出。
但是,读到EOF却未换行会返回1。
可以read后用$?的值是否为0来作为条件进行捕获。
当然read逐字读取时不适用,但是我们还有方法专门针对逐字读取:

while :; do read -N 1 key&&if [[ ${key} == $(printf "\004") ]];then echo CTRL-D;fi; done

似乎挺没用的。

网易云歌曲名称格式化:

网易云默认下载的音乐命名格式是这样的:

Akie秋绘 - なんでもないや 没什么大不了的(翻自 Radwimps).mp3
ENE - パズル.mp3
Hanser - 勾指起誓.mp3
のぶなが - 深海少女.mp3
南杉 - 樱花樱花想见你.mp3
鹿乃 - 小夜子.mp3
鹿乃 - 心拍数#0822.mp3
鹿乃 - 桜のような恋でした.mp3

(浓度过纯)
咱们可以这样:

ls *.mp3|while read music
do
artist=${music%% -*}
name=${music##*-\ }
name=${name%%.mp3}
name=${name%%"("*}
name=${name%%"("*}
mv "$music" "$name-[$artist].mp3"
done

于是文件名就成了这样:

なんでもないや 没什么大不了的-[Akie秋绘].mp3
パズル-[ENE].mp3
勾指起誓-[Hanser].mp3
深海少女-[のぶなが].mp3
樱花樱花想见你-[南杉].mp3
小夜子-[鹿乃].mp3
心拍数#0822-[鹿乃].mp3
桜のような恋でした-[鹿乃].mp3

个人感觉好看多了。

萌新代码生成:

x(){
echo -e "number=input(\"请输入一个数字:\")"
echo -e "if number == 0:\n    print(\"0是一个偶数\")"
for i in {1..114514}
do
[[ $(($i%2)) == 0 ]]&&echo -e "elif number == $i:\n    print(\"$i是一个偶数\")"||echo -e "elif number == $i:\n    print(\"$i是一个奇数\")"
done
echo -e "else:\n    print(\"数太大了我还不会\")"
}
x > 1.py

逝python,但是运行会直接内存错误。

生草部分:

变量当函数/命令名执行:

test(){
  $@
}
test ls

不做类型检查你就可以为所欲为了是吧。

忽略Ctrl+C:

用户别想用Ctrl+C杀死你的进程(大草)。

trap "" SIGINT

标签:Shell,技巧,read,print,echo,WIDTH,mp3,test
From: https://www.cnblogs.com/Moe-hacker/p/18520371

相关文章

  • 2024最新IntelliJ IDEA常用的小技巧汇总,JAVA 新手上路必备
    目录一、IntelliJIDEA概述二、下载与安装2.1下载2.2安装三、快速创建并运行Java工程3.1创建Java工程3.2创建package和class四、详细设置4.1字体大小设置4.2字符编码设置4.3大小写不敏感设置4.4自动导包4.5启动退出设置4.6自动更新五、快速开发5.1代码模板......
  • ShellScript
    StorageSrvShelScript编写添加用户的脚本,存储在/shells/userAdd.sh目录。当有新员工入职时,管理员运行脚本为其创建公司账号。自动分配客户端账号、公司邮箱、samba目录及权限、网站账号等。以userAddlifei的方式运行脚本,lifei为举例的员工姓名前提条件完成了LDAP服务......
  • shell中的IFS变量与词分割
    引入在bash、zsh、csh等等各种shell实现中,都有一个特殊的内置变量IFS(InternalFieldSeparator),意为内部字段分隔符。IFS变量值是一个字符序列,shell会将IFS字符序列中的各个字符视为词分割(wordsplitting)过程中分隔不同token的边界。正文1.什么是词分割以及什么情......
  • 使用PHP构建命令行应用的技巧
    ###使用PHP构建命令行应用的技巧在开头,我们直接回答使用PHP构建命令行应用的技巧:选择合适的库、理解命令行界面(CLI)的基本原理、熟悉PHPCLI的内置功能、编写可维护的代码、进行彻底的测试。其中,选择合适的库是基础且关键的一步。使用如SymfonyConsole或LaravelZero等库可以大......
  • 项目计划中的时间估算技巧
    在项目计划中,时间估算技巧是至关重要的一环。一般而言,在项目计划中的时间估算可以采用专家判断、类比估算、参数估算、三点估算和决策树分析等技巧。此外,有效的时间管理,包括识别关键路径、微调计划以适应实际情况,以及持续跟踪进度,也十分关键。接下来,我将主要讨论专家判断这一技......
  • 【Python】网络请求与数据获取:Requests库的使用与技巧
    网络请求与数据获取:Requests库的使用与技巧在现代Web开发与数据科学工作中,从API、网页或服务端获取数据是非常常见的任务,而Python的Requests库为此提供了便捷且功能强大的工具。本文将从基本的HTTP请求操作出发,结合常见的数据获取需求,深入讲解Requests的使用......
  • SQL优化的35个小技巧
    避免使用SELECT*,使用具体字段反例:SELECT*FROMemployee;正例:SELECTid,name,ageFROMemployee;使用具体字段可以节省资源、减少网络开销,且能避免回表查询。避免在WHERE子句中使用OR反例:SELECT*FROMuserWHEREuserid=1ORage=18;正例:--使用UNION......
  • PMP–一、二、三模、冲刺–分类–8.质量管理–技巧–成本效益分析
    文章目录技巧一模1.引论--阶段关口--为做出进入下个阶段、进行整改或结束项目集或项目的决定,做的阶段未审查。审查一个阶段末的问题,做成本效益分析,以决定下个阶段的项目。39、[单选]在新目标国家推出产品前不久,公司意识到该产品并不完全符合当地的数据隐私法。由于预算......
  • 【AIGC】深入探索『后退一步』提示技巧:激发ChatGPT的智慧潜力
    博客主页:[小ᶻZ࿆]本文专栏:AIGC|ChatGPT文章目录......
  • 【Linux篇】常用命令及操作技巧(进阶篇 - 下)
    ......