wtf is wtf?
wtf是一个linux里的一个指令,在bsdgames包里。使用之前要用sudo apt install bsdgames下载一下这个包。
他的作用是告诉你一个术语是什么意思。比如你碰到了lol,但是你不知道是什么意思,你就可以输入wtf is lol
如果输入wtf is wtf呢?
他会很正经地告诉你:WTF: {what,where,who,why} the fuck
wtf里有什么
我们来看看这个指令怎么实现的。
1 |
|
[]表示可选,<>表示必选
[-t type]表示-t后面要跟着个类型,比如wtf -t internet is TCP,然而这个type似乎需要另外安装数据库才能使用。我的默认type只有comp,所以只能搜索comp类型的。路径是${ACRONYMDB:-/usr/share/games/bsdgames}
args= `getopt f:t: $*` 中的反引号表示运行中间的内容,同时将返回的字符传给前面的变量,也就是args。那我们就要了解getopt的作用是什么。只着眼于目前的用法,f:t:表示-f和-t后面需要有参数,并且将当前指令“格式化”。比如在终端中输入
1 | huaziqi@LAPTOP:/mnt/c/Users/huaziqi$ getopt f:t: is -t type -f file jj |
它会将参数全部放在--前面,这样就方便后续的处理。那
if [ $? -ne 0 ]; then这一句中有两个点:$?表示什么,-ne表示什么?
&?表示上一个指令返回的参数。上一个指令是哪一个?其实就是那个getopt指令,``直接会把括在里面的内容运行起来。如果运行完全没有问题,他就会返回一个0,如果返回的不是0,那就表示运行时出现了一些问题。可以尝试一下在bash中运行getopt f:t: -f oo -t他会显示运行错误,再输入echo $?会输出1而不是0,输入正确的指令再输出$?就是0了。
运行错误就说明指令出错,就会调用usage,然后exit 1这个1应该就表示这个指令运行错误的参数,存储在$?中。
-ne是not equal的缩写,equal就是-eq,greater than就是-gt,还有-ge,有点像汇编里的跳转指令。
set -- $args指令表示将当前参数的顺序设置为args里的。args中的参数顺序是经过getopt重排过的。如果不执行的话,参数顺序就是
1 | $0 = wtf |
is也可能放在前面$1,执行过后的顺序是这样的
1 | $0 = wtf |
这里有一个细节就是$0是不会变的。首先set --指令不会设置
还有一个细节是关于这个脚本名的。观察到$0 = wtf,那么basename $0中的basename似乎没什么用?并非如此。因为大多数情况下用户输入的都是wtf,所以$0也是wtf,但是用户也可以输入一个完整的路径名,比如/usr/local/bin/wtf,那么这时候就需要用到basename了。平时我们用的wtf也只是提前写在环境变量中,bash才知道具体的路径。
再往下看,先了解一下case的用法:
1 | case 变量 in |
*)表示其他情况,esac表示case的结束,其实就是倒过来写的case。然后每一种情况要使用单行的两个;结束。
在代码中,我们还看到了其他很多的;,那么什么时候要用到 ; ?gpt说,如果一行出现了两个指令,此时就需要;来分隔。比如说:
1 | if [] |
或者
1 | if []; then |
大概就是这样。因为这一行中既有if又有then,所以要使用;分隔。
while [ $# -gt 0 ]; do while的条件是参数数量大于0。$#就表示参数数量,后面的shift表示