掌握Shell脚本:函数定义与系统初始化编写技巧

发表时间: 2023-11-06 23:05

脚本中定义及使用函数

函数在使用前必须定义,因此应将函数定义放在脚本开始部分,直至shell首次发现它后才能使用,调用函数仅使用其函数名即可

#!/bin/bash#********************************************************************#Author:            wei#FileName:          func.sh#********************************************************************hello () {    echo "Hello there today's date is `date +%F`"}echo "now going to the function hello"helloecho "back from the function"[root@cent7 ~]#bash func1.shnow going to the function helloHello there today's date is 2021-05-29back from the function  [root@C17-17 scripts]#cat func.sh#!/bin/bash#********************************************************************#Author:                wei#FileName:                 func.sh#********************************************************************hello () {    echo "Hello there today's date is `date +%F`"}echo "now going to the function hello"helloecho "back from the function"hello[root@C17-17 scripts]#bash func.shnow going to the function helloHello there today's date is 2023-11-06back from the functionHello there today's date is 2023-11-06


系统初始化脚本

#!/bin/bash#********************************************************************#Author:            wei#FileName:          init.sh#********************************************************************disable_selinux(){    sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config    echo "SElinux已禁用,重新启动后才可生效"}disable_firewall(){    systemctl disable --now firewalld &> /dev/null    echo "防火墙已禁用"}set_ps1() {    echo 'PS1="\[\e[1;35m\][\u@\h \W]\$\[\e[0m\]"' > /etc/profile.d/reset.sh    echo "提示符已修改成功,请重新登录生效"}set_eth(){    sed -i.bak  '/GRUB_CMDLINE_LINUX=/s#"$# net.ifnames=0"#' /etc/default/grub    grub2-mkconfig -o /boot/grub2/grub.cfg &> /dev/null    echo "网络名称已修改成功,请重新启动才能生效"}PS3="请选择相应的编号(1-6): "MENU='禁用SELinux关防火墙修改提示符修改网卡名以上全实现退出'select M in $MENU ;docase $REPLY in1)    disable_selinux    ;;2)    disable_firewall    ;;3)    set_ps1    ;;4)    set_eth    ;;5)    disable_selinux    disable_firewall    set_ps1    set_eth    ;;6)    break    ;;*)    echo "请输入正确的数字"esacdone[root@C17-17 scripts]#bash init.sh1) 禁用SELinux  3) 修改提示符   5) 以上全实现2) 关防火墙     4) 修改网卡名   6) 退出请选择相应的编号(1-6): 1SElinux已禁用,重新启动后才可生效请选择相应的编号(1-6): 3提示符已修改成功,请重新登录生效请选择相应的编号(1-6): 9请输入正确的数字请选择相应的编号(1-6): 6


函数参数

函数可以接受参数

  • 传递参数给函数: 在函数名后面以空白分隔给定参数列表即可,如: testfunc arg1 arg2 ....
  • 在函数体中当中,可使用,,...调用这些参数;还可以使用$@,$* .$#等特殊变量
$$  Shell本身的PID(ProcessID) $!  Shell最后运行的后台Process的PID $? 最后运行的命令的结束代码(返回值) $-  使用Set命令设定的Flag一览 $* 所有参数列表。如"$*"用「"」括起来的情况、以" $n"的形式输出所有参数。 $@  所有参数列表。如"$@"用「"」括起来的情况、以"" """$n" 的形式输出所有参数。 $#  添加到Shell的参数个数 $0  Shell本身的文件名 $1~$n 添加到Shell的各参数值。是第1参数、是第2参数…。#在脚本中添加set -x可以进行每一行的调试

实现进度条功能

#!/bin/bash#********************************************************************#Author:            wei#FileName:          progress_chart.sh#********************************************************************function print_chars () {    #传入的第一个参数指定要打印的字符串    local char=""    #传入的第二个参数指定要打印多少次指定的字符串    local number=""    local c    for (( c=0;c<number;++c ));do        printf "$char"    done}COLOR=32declare -i end=50for ((i=1;i<=end;++i));do    printf "\e[1;${COLOR}m\e[80D["    print_chars "#" $i    print_chars " " $((end - i))    printf "] %3d%%\e[0m" $((i*2))    sleep 0.1sdoneecho #bash   progress_chart.sh[##################################################] 100%                                                  [root@C17-17 scripts]#cat progress_chart.sh#!/bin/bash#********************************************************************#Author:                wei#FileName:                 progress_chart.sh#********************************************************************function print_chars () {    #传入的第一个参数指定要打印的字符串    local char=""    #传入的第二个参数指定要打印多少次指定的字符串    local number=""    local c    for (( c=0;c<number;++c ));do        printf "$char"    done}COLOR=32declare -i end=50for ((i=1;i<=end;++i));do    printf "\e[1;${COLOR}m\e[80D["    print_chars "#" $i    print_chars " " $((end - i))    printf "] %3d%%\e[0m" $((i*2))    sleep 0.1sdoneecho[root@C17-17 scripts]#bash progress_chart.sh[##################################################] 100%[root@C17-17 scripts]#

[root@C17-17 scripts]#cat progress_chart1.sh#!/bin/bash#********************************************************************#Author:                wei#FileName:                 progress_chart.sh#********************************************************************function print_chars(){    #传入的第一个参数指定要打印的字符串    local number=""    local c    for (( c=0;c < number;++c ));do        printf "$char"    done}COLOR=32declare -i end=50for (( i=1; i <= end ;++i));do    printf "\e[1;${COLOR}m\e[80D["    print_chars "#" $i    print_chars " " $((end - i))    printf "] %3d%%\e[0m" $((i * 2))    sleep 0.1sdoneecho[root@C17-17 scripts]#bash progress_chart1.sh[] 100%