bash 技巧

本文主要记录一些bash的语法,备忘

英文还行的话,看看这篇Bash Guide for Beginners

1. 进制转换

$ echo $(( 2#11 ))
3
$ echo $(( 16#1E ))
30

即将指定进制的数转为10进制,例如上面是将16进制的数1E转为10进制,所以结果是30。

2. 查看变量值由多少个字符组成

$ a="Hello world"; echo ${#a}
11

参考:bash 算式

3. Here Documents(不好意思,不知道怎么翻译)

下面的>也是提示符
$ cat <<EOF
> 1
> 2
EOF
1
2
$ cat <<'EOF'
> $1
> $2
EOF
$1
$2

我一般用这个完成多行注释
$ :<<'EOF'
> line1
> line2
EOF

参考:Bash Reference Manual

4. Coprocesses

使用coproc后面接shell命令的方式, 可以让命令在后台启动, 后面的命令就可以通过特定的方式来访问其输入和输出。
还是用示例来说明吧,我又感到了言匮词穷。。。
$ coproc awk '{print "I am "$0; fflush()}'
[1] 8156
$ echo 'happy' >&${COPROC[1]}
$ read -u ${COPROC[0]} s
$ echo $s
I am happy
$ kill ${COPROC_PID}
[1]+ Terminated coproc COPROC awk '{print "I am "$0; fflush()}'

说起来就是变量COPROC[0]是这个后台进程的stdout对应的文件描述符, 变量COPROC[1]是这个后台进程的stdin对应的文件描述符, 变量COPROC_PID是这个后台进程的进程号。
参考:
1.Coprocesses
2.how-do-you-use-the-command-coproc-in-various-shells

5. ps 查看进程状态

$ ps -eo pid,lstart,etime,cmd # 查看进程号,进程启动时间,运行时间,命令名
$ man ps # ps命令的参数实在很多很杂,现在我已放弃记忆,不清楚就直接man一下

6. 花括号扩展

$ echo a{d,c,b}e
ade ace abe
$ echo a{01..5}
a01 a02 a03 a04 a05
$ echo /usr/{ucb/{ex,edit},lib/{ex?.?,how_ex}}
/usr/ucb/ex /usr/ucb/edit /usr/lib/ex?.?
/usr/lib/how_ex
$ b=2;echo {${b},6} # 花括号扩展中${b}这种变量替换方式不受影响。
2 6

需要注意的是花括号扩展比其它扩展优先级要高。
(Brace expansion is performed before any other expansions, and any characters special to other expansions are preserved in the result. It is strictly textual.)
参考:
1.bash manual
2.浅析 Bash 中的 {花括号}

7. tar命令

$ tar -cvf log.tar *.log # 1.把所有的log文件打包成log.tar(必须指定一个文件名)
$ tar -czvf log.tar.gz *.log # 2. 把所有的log文件打包并用gzip压缩成log.tar.gz
$ tar -cjvf log.tar.bz2 *.log # 3. 把所有的log文件打包并用bzip2压缩成log.tar.bz2
$ tar -xvf log.tar # 4. 解包,1的逆向操作
$ tar -xzvf log.tar.gz # 5. 用gunzip解压缩并解包,2的逆向操作
$ tar -xjvf log.tar.bz2 # 6. 用bunzip2 解压缩并解包,3的逆向操作
# -C 可指定输出到指定文件夹
# -c 打包 -z 用gzip压缩 -j 用bzip2压缩 -x 解包 -v 显示详细信息

参考:
1.tar命令详解

原文地址:https://www.cnblogs.com/lyg-blog/p/11768308.html