Bash Shell 函数教程的 6 个示例

举报
Tiamo_T 发表于 2022/02/07 13:23:31 2022/02/07
【摘要】 Bash shell 函数是一种将多个 UNIX/Linux 命令分组以供以后使用组的单个名称执行的方法。 Bash shell 函数可以像普通的 Unix 命令一样执行。 Shell 函数在当前 shell 上下文中执行,而不创建任何新进程来解释它们。

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 文件中,以确保您始终可以访问这些函数,而不必每次都创建它。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。