掌握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
函数可以接受参数
$$ 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%