Bash Shell 函数教程的 6 个示例
Bash shell 函数是一种将多个 UNIX/Linux 命令分组以供以后使用组的单个名称执行的方法。
Bash shell 函数可以像普通的 Unix 命令一样执行。
Shell 函数在当前 shell 上下文中执行,而不创建任何新进程来解释它们。
bash 别名和函数都允许您为更长或更复杂的命令定义快捷方式。但是,别名不允许控制流、参数和其他这些函数将允许的诡计,如本教程中所述。
本文是正在进行的 bash 教程系列的一部分。请参阅我们之前关于bash 介绍、bash 存在状态和bash 别名示例的教程。
创建 bash 函数的语法:
function functionname()
{
commands
.
.
}
- function是一个可选的关键字。
- functionname是函数的名称
- commands - 要在函数中执行的命令列表。
函数接受参数。在执行期间,函数的参数成为位置参数。位置参数 0 将具有保持不变的脚本名称。
您可以从命令行调用 bash 函数,如下所示:
$ functionname arg1 arg2
- 当 shell 解释 Linux 命令时,它首先查找特殊的内置函数,如 break、continue、eval、exec 等,然后查找 shell 函数。
- bash函数的退出状态是函数体中最后执行的命令的退出状态。
注意:将 shell 函数定义放在 shell 启动文件中(例如 .bash_profile )。这样,shell 函数始终可以从命令行使用。请参阅我们之前的bash 执行序列文章,以确定何时执行 .bash_profile。
示例 1:显示具有给定扩展名的长文件列表的函数
函数“lsext”用于查找当前目录中的文件列表,该目录具有给定的扩展名,如下所示。此功能使用find 命令和ls 命令的组合来完成工作。
$ function lsext()
{
find . -type f -iname '*.'${1}'' -exec ls -l {} \; ;
}
$ cd ~
$ lsext txt
-rw-r--r-- 1 root root 24 Dec 15 14:00 InMorning.txt
-rw-r--r-- 1 root root 184 Dec 16 11:45 Changes16.txt
-rw-r--r-- 1 root root 458 Dec 18 11:04 Changes18.txt
-rw-r--r-- 1 root root 1821 Feb 4 15:01 ChangesOfDB.txt
示例 2. 对一组文件执行给定 Linux 命令的 Bash 函数
在以下示例中,函数“batchexec”查找具有给定扩展名的文件并在这些选定文件上执行给定命令。
$ function batchexec()
{
find . -type f -iname '*.'${1}'' -exec ${@:2} {} \; ;
}
$ cd ~
$ batchexec sh ls
$ batchexec sh chmod 755
$ ls -l *.sh
-rwxr-xr-x 1 root root 144 Mar 9 14:39 debug.sh
-rwxr-xr-x 1 root root 5431 Jan 25 11:32 get_opc_vers.sh
-rwxr-xr-x 1 root root 22 Mar 18 08:32 t.sh
在上面的例子中,它找到了所有扩展名为 .sh 的 shell 脚本文件,并将其权限更改为 755。(用户的所有权限,组和其他人的读取和执行权限)。在函数定义中,您会注意到“${@:2}”,它给出了第二个和后面的位置参数(shell 扩展功能)。
示例 3. 生成随机密码的 Bash 函数
以下函数用于生成具有给定长度的特殊字符的随机强密码。如果默认没有给出长度,它会生成 12 个字符的长度。
$ function rpass() {
cat /dev/urandom | tr -cd '[:graph:]' | head -c ${1:-12}
}
$ rpass 6
-Ju.T[[
$ rpass
Gz1f!aKN^""k
在上面的示例中,当 rpass 使用参数 6 执行时,它会生成 6 个字符的随机密码,而不带参数的 rpass 会生成 12 个字符长度的密码。${1:-12} 表示如果 $1 未设置或返回 null 12 ,否则 $1 的值将被替换。
示例 4. 获取给定接口 IP 地址的 Bash 函数
以下示例定义了一个名为“getip”的函数,该函数接受接口名称作为参数,并给出在机器中给定接口上分配的 IP 地址。(默认情况下它返回 eth0 ip 地址)。这使用ifconfig 命令来获取 IP 地址。
$ function getip()
{
/sbin/ifconfig ${1:-eth0} | awk '/inet addr/ {print $2}' | awk -F: '{print $2}';
}
$ getip
15.110.106.86
$ getip eth0
15.110.106.86
$ getip lo
127.0.0.1
示例 5. 打印机器详细信息的 Bash 函数
此示例定义了提供有关机器的所有必需信息的函数。用户可以在启动文件中定义和调用该函数,以便在启动时获取这些信息。
$ function mach()
{
echo -e "\nMachine information:" ; uname -a
echo -e "\nUsers logged on:" ; w -h
echo -e "\nCurrent date :" ; date
echo -e "\nMachine status :" ; uptime
echo -e "\nMemory status :" ; free
echo -e "\nFilesystem status :"; df -h
}
$ mach
Machine information:
Linux dev-db 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 GNU/Linux
Users logged on:
root pts/2 ptal.mot Wed10 0.00s 1.35s 0.01s w -h
Current date :
Thu Mar 18 11:59:36 CET 2010
Machine status :
11:59:36 up 7 days, 3 min, 1 user, load average: 0.01, 0.15, 0.15
Memory status :
total used free shared buffers cached
Mem: 2059768 2033212 26556 0 81912 797560
-/+ buffers/cache: 1153740 906028
Swap: 4192956 48164 4144792
Filesystem status :
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 12G 12G 0 100% /
tmpfs 1006M 377M 629M 38% /dev/shm
/dev/sdc5 9.9G 409M 9.0G 5% /mydisk
示例 6:更好地格式化 ls 输出的 Bash 函数
以下函数将清屏,将光标置于屏幕顶部,执行 ls,然后将光标置于屏幕末尾。
$ function ll ()
{
clear;
tput cup 0 0;
ls --color=auto -F --color=always -lhFrt;
tput cup 40 0;
}
$ ll
使用 type 命令显示功能代码
type 是用于查看函数代码的shell 内置。
Syntax:
type function-name
$ type ll
ll is a function
ll ()
{
clear;
tput cup 0 0;
ls --color=auto -F --color=always -lhFrt;
tput cup 40 0;
alias ls="ls --color=auto -F"
}
为了便于参考,请从这个示例 .bash_profile 函数文件中获取本文提到的所有 6 个函数。
将所有这些函数添加到您的 ~/.bash_profile 文件中,以确保您始终可以访问这些函数,而不必每次都创建它。
- 点赞
- 收藏
- 关注作者
评论(0)