方法1:
函数名() { 函数体(一堆命令的集合,来实现某个功能) }
方法2:
function 函数名() { #函数体(一堆命令的集合,来实现某个功能) echo hello echo world local sum #定义一个范围只在函数中的变量 }
函数中return说明:
函数的返回值就是函数最后一句话执行的状态码
return可以结束一个函数。类似于循环控制语句break(结束当前循环,执行循环体后面的代码)。
return默认返回函数中最后一个命令状态值,也可以给定参数值,范围是0-256之间。
如果没有return命令,函数将返回最后一个指令的退出状态值。
例:(这样才会显示出我们真正要的函数的返回值)
注:如果要突破0-256的限制可以这样写:
[root@MissHou shell04]# cat fun1.sh #!/bin/bash hello(){ echo "hello lilei $1" hostname } menu(){ cat <<-EOF 1. mysql 2. web 3. app 4. exit EOF } #传参时用$1、$2等,传数组时用$*、$@等表示取数组中所有数值 [root@MissHou shell04]# source fun1.sh [root@MissHou shell04]# . fun1.sh [root@MissHou shell04]# hello 888 hello lilei 888 MissHou.itcast.cc [root@MissHou shell04]# menu 1. mysql 2. web 3. app 4. exit
[root@MissHou shell05] vim ~/.bashrc #文件中增加如下内容: hello(){ echo "hello lilei $1" hostname } menu(){ cat <<-EOF 1. mysql 2. web 3. app 4. exit EOF } #注意: #当用户打开bash的时候会读取该文件
#!/bin/bash #打印菜单 source ./fun1.sh menu(){ cat <<-END h 显示命令帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序 END } menu #调用函数 #如果对函数传数字1为第一个参数就在脚本中写成 "menu 1"这种类型 #如果要写成在命令行传参就写成"menu $1"
具体需求:
思路:
交互式定义多个变量来保存用户信息 姓名、性别、年龄
如果不输一直提示输入
根据用户输入信息做出匹配判断
代码实现:
#!/bin/bash #该函数实现用户如果不输入内容则一直循环直到用户输入为止,并且将用户输入的内容打印出来 input_fun() { input_var="" output_var=$1 while [ -z $input_var ] do read -p "$output_var" input_var done echo $input_var } input_fun 请输入你的姓名: 或者 #!/bin/bash fun() { read -p "$1" var if [ -z $var ];then fun $1 else echo $var fi } #调用函数并且获取用户的姓名、性别、年龄分别赋值给name、sex、age变量 name=$(input_fun 请输入你的姓名:) sex=$(input_fun 请输入你的性别:) age=$(input_fun 请输入你的年龄:) #根据用户输入的性别进行匹配判断 case $sex in man) if [ $age -gt 18 -a $age -le 35 ];then echo "中年大叔你油腻了吗?加油" elif [ $age -gt 35 ];then echo "保温杯里泡枸杞" else echo "年轻有为。。。" fi ;; woman) xxx ;; *) xxx ;; esac
现有的跳板机虽然实现了统一入口来访问生产服务器,yunwei用户权限太大可以操作跳板机上的所有目录文件,存在数据被误删的安全隐患,所以希望你做一些安全策略来保证跳板机的正常使用。
欢迎使用Jumper-server,请选择你要操作的主机: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exit
#!/bin/bash # jumper-server # 定义菜单打印功能的函数 menu() { cat <<-EOF 欢迎使用Jumper-server,请选择你要操作的主机: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exit EOF } # 屏蔽以下信号 trap '' 1 2 3 19 # 调用函数来打印菜单 menu #循环等待用户选择 while true do # 菜单选择,case...esac语句 read -p "请选择你要访问的主机:" host case $host in 1) ssh root@10.1.1.1 ;; 2) ssh root@10.1.1.2 ;; 3) ssh root@10.1.1.3 ;; h) clear;menu ;; q) exit ;; esac done #将脚本放到yunwei用户家目录里的.bashrc里执行: bash ~/jumper-server.sh exit
进一步完善需求
为了进一步增强跳板机的安全性,工作人员通过跳板机访问生产环境,但是不能在跳板机上停留。
#!/bin/bash #公钥推送成功 trap '' 1 2 3 19 #打印菜单用户选择 menu(){ cat <<-EOF 欢迎使用Jumper-server,请选择你要操作的主机: 1. DB1-Master 2. DB2-Slave 3. Web1 4. Web2 h. help q. exit EOF } #调用函数来打印菜单 menu while true do read -p "请输入你要选择的主机[h for help]:" host #通过case语句来匹配用户所输入的主机 case $host in 1|DB1) ssh root@10.1.1.1 ;; 2|DB2) ssh root@10.1.1.2 ;; 3|web1) ssh root@10.1.1.250 ;; h|help) clear;menu ;; q|quit) exit ;; esac done 自己完善功能: 1. 用户选择主机后,需要事先推送公钥;如何判断公钥是否已推 2. 比如选择web1时,再次提示需要做的操作,比如: clean log 重启服务 kill某个进程
trap--回顾信号:
1) SIGHUP 重新加载配置 2) SIGINT 键盘中断^C 3) SIGQUIT 键盘退出 9) SIGKILL 强制终止 15) SIGTERM 终止(正常结束),缺省信号 18) SIGCONT 继续 19) SIGSTOP 停止 20) SIGTSTP 暂停^Z