Bash Shell 技巧
快速命令编辑
文件名生成
完成
套接字通信
算术评估
这篇文章最初发表于我的博客,发表于2007年,我很高兴看到它经久不衰。即使到了今天,我仍然在使用这里提到的许多技巧。
快速命令编辑
^orig^repl^
将上一个命令中的“orig”替换为“repl”,然后执行新命令。
文件名生成
cp filename{,.bak}
将“filename”复制为“filename.bak”。mkdir -p dir{1,2,3}/subdir{1,2}
创建dir1/subdir1
、dir1/subdir2
、dir2/subdir1
、dir2/subdir2
、dir3/subdir1
和dir3/subdir2
目录
完成
不,我说的不是命令/文件名的补全。我说的是各种命令的参数补全,以及根据应用程序补全文件名。这是
zsh 备受推崇的功能之一,但很多人不知道的是,它也可以在 bash 中使用。
你只需要安装bash-completion即可。
安装 bash 补全后,您可以使用TAB
键来补全常用命令(例如 etc)的参数。 此外rpm, apt, find, grep
,bash-completion 还会通过查找文件中的主机名来补全主机名。对于基于 Linux 的发行版,bash-completion 甚至会查找已安装的软件包名称。ssh, scp
$HOME/.ssh/authorized_keys
rpm
我发现最方便的功能是基于命令上下文的文件名完成。例如,如果您键入tar -zxvf
然后按两次 TAB 键,您将获得以结尾的文件列表,.tar.gz or .tgz
而不是目录中所有文件的列表。
套接字通信
我敢打赌很多人没听说过,但 bash 确实可以通过 进行基本的套接字通信/dev/tcp, /dev/udp
。这些是 bash 用于与网络套接字通信的伪设备。事实上,如果你听说过,ls -l /dev/tcp /dev/udp
你会收到“没有此文件或目录”的错误消息。
那么如何使用它们呢,下面我给出 2 个示例。
一个用于快速检查 HTTP 服务器标头的函数。这里有一个简单的函数,你可以把它添加到你的$HOME/.bashrc
代码中,用来检查 HTTP 服务器的标头。
headers() {
server=$1; port=${2:-80}
exec 5<> /dev/tcp/$server/$port
echo -e "HEAD / HTTP/1.0\nHost: ${server}\n\n" >&5;
cat 0<&5;
exec 5>&-
}
只需通过以下方式调用它
headers <servername or ip> <port>
如果未提供,端口号默认为 80。
第二个示例是检查端口是否打开的快速方法。当然,你也可以使用 netcat 或 telnet,但我觉得这个更方便。
testPort() {
server=$1; port=$2; proto=${3:-tcp}
exec 5<>/dev/$proto/$server/$port
(( $? == 0 )) && exec 5<&-
}
再次调用它
testPort <servername or ip> <port> <protocol>
协议可以是tcp或udp,默认为tcp。
算术评估
Bash 可以执行算术运算。它们使用起来非常方便expr
。以下是一些示例。请注意,变量名没有 $ 前缀。
((count++)) #increment value of variable 'count' by one.
((total+=current)) # set total = total+current.
((current>max?max=current:max=max)) # ternary expression.