Bash实用操作
简单的日常操作
计算字符串长度:
$ expr length "98H42597Y9200405M" 17
批量修改文件名
目标:进行这样的转换:
libs/mail_xxx.php => libs/emails/xxx.php
Bash命令如下:
$ for f in $(ls libs/mail_*); do mv $f libs/emails${f/libs\/mail_//}; done;
解析。首先是列出所有的目标文件:
$(ls libs/mail_*)
并把它放到for循环中,作为迭代对象:
for f in $(ls libs/mail_*)
Bash的for循环其实质是foreach,它的形式如下:
$ for i in 1 2 3; do echo $i; done; $ for i in {1..3}; do echo $i; done; $ for (( i=1; i<4; ++i )); do echo $i; done;
随后,在foreach中对目标文件进行重命名:
mv $f libs/emails${f/libs\/mail_//}
其关键是Bash的字符串替换操作(string replacement),它的形式如下:
${string/pattern/replacement} # replace only first match ${string//pattern/replacement} # replace all the matches
例如:
$ descr="Learn Linux - Linux Sockect - Linux Thread" $ echo ${descr/Linux/BSD} Learn BSD - Linux Sockect - Linux Thread $ echo ${descr//Linux/BSD} Learn BSD - BSD Sockect - BSD Thread
因此以下语句将"libs/mail_"子串删除,并在前面添加了"libs/emails":
libs/emails${f/libs\/mail_//}
Bash扩展
bash-completion
Bash环境下的TAB能自动补全命令等,但有些时候却无法按你想象的进行,如想找Apache管理命令的帮助,但记不清了:
$ man apa<TAB>
关键时候Bash无动于衷了。因此我们需要更好的补全方案。bash 2.05之后的版本提供了自动补齐的编程接口,当然我们不必自己编程了,下载bash-completion即可,它可以补齐几乎任何内容:
# yum install bash-completion
在~/.bashrc中添加一句(默认被安装到了/etc/bash_completion):
if [ -f /etc/bash_completion ]; then bash /etc/bash_completion fi
运行~/.bashrc即可:
$ . ~/.bashrc $ man apa<TAB>