欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 13_02 _bash脚本编程之十 函数) 有大用

函数:功能 function 

代码重用:

库: so



脚本编程之函数:

function: 功能

结构化编程,不能独立运行,需要调用时执行,可以多次被调用

定义一个函数:

function FUNCNAME {     //此使用function关键字的时候,就不需要加小括号

    command

}


FUNCNAME() {      //小括号紧跟在名称后面, 不要加空格

   command

}


自定义执行状态返回值: (如果用exit 就退出整个脚本了,就不是退出函数了)

return # (0-255)     (一旦用到return 函数就自动结束了,就终止了)



脚本自定义的状态返回值 exit # (0-255)


接受参数的函数




./a.sh m n (脚本调用参数) $1:m  $2:n  位置参数,函数也是一个道理

TWOINT 5 6 

$1:5

$2:6




练习:写一个脚本,判定 192.168.0.200-192.168.0.254 之间的主机哪些在线.要求:

1, 使用函数来实现一台主机的判定过程 

2,在主程序中来调用此函数判定指定范围内的所有主机的在线情况


判定B类网 172.16 怎么做



写一个脚本,使用函数完成

1,函数能够接受一个参数,参数为用户名:

    判断一个用户是否存在

    如果存在,就返回此用户的shell和UID,并返回正常状态值

    如果不存在,就说此用户不存在,并返回错误状态值

2,在主程序中调用函数

扩展1:在主程序中,让用户自己输入用户名后,传递给函数来进行判断

扩展2:在主程序中,输入用户名判断后不退出脚本,面是提示用户继续输入下一个用户名,如果用户输入的用户不存在,请用户重新输入但如果用户输入q或Q就退出





image.png












[root@ebs-22618 ~]# vim diskuage.sh

#!/bin/bash

#

cat << EOF

d|D) show disk usages

m|M) show memory usages

s|S) show swap usages

q|Q) quit.

EOF


read -p "Your choice: "  CHOICE


until [ $CHOICE == 'q' -o $CHOICE == 'Q' ]; do

case $CHOICE in

d|D) df -lh;;

m|M) free -m | grep "^Mem";;

s|S) free -m | grep "^Swap";;


#*) read -p "Your choice: "  CHOICE;;

esac

read -p "Your choice: "  CHOICE


done

image.png




[root@ebs-22618 ~]# vim sum3.sh

#!/bin/bash

#

A=9

B=7

C=$[$A+$B]

echo $C

~





[root@ebs-22618 ~]# vim adduser.sh

#!/bin/bash

#

if ! id -u $1 &>/dev/null; then

   useradd $1

   echo $1 | passwd --stdin $1 &> /dev/null

fi


~





[root@ebs-22618 ~]# vim showmenu.sh

#!/bin/bash

#

function SHOWMENU {

cat << EOF

d|D) show disk usages

m|M) show memory usages

s|S) show swap usages

q|Q) quit.

EOF

}

SHOWMENU

SHOWMENU

SHOWMENU


[root@ebs-22618 ~]# chmod +x showmenu.sh


这一次用bash 来执行吧

[root@ebs-22618 ~]# bash -x showmenu.sh

image.png









[root@ebs-22618 ~]# vim diskuage2.sh

#!/bin/bash

#

function SHOWMENU {           //(可以改成 SHOWMENU() {  记住小括号紧跟在后面 )

cat << EOF

d|D) show disk usages

m|M) show memory usages

s|S) show swap usages

q|Q) quit.

EOF

}

SHOWMENU


read -p "Your choice: "  CHOICE


until [ $CHOICE == 'q' -o $CHOICE == 'Q' ]; do

case $CHOICE in

d|D) df -lh;;

m|M) free -m | grep "^Mem";;

s|S) free -m | grep "^Swap";;


#*) read -p "Your choice: "  CHOICE;;

esac

SHOWMENU

read -p "Your choice: "  CHOICE


done

image.png

[root@ebs-22618 ~]# chmod +x diskuage2.sh

image.png



[root@ebs-22618 ~]# vim sum3.sh

#!/bin/bash

#

TWOINT() {

A=9

B=7

C=$[$A+$B]

echo $C

}

TWOINT

image.png


[root@ebs-22618 ~]# chmod +x sum3.sh

[root@ebs-22618 ~]# ./sum3.sh

16


[root@ebs-22618 ~]# vim sum3.sh


#!/bin/bash

#

TWOINT() {

A=9

B=7

C=$[$A+$B]

echo $C            //这是函数的执行结果,就是输出到屏幕的内容

}

M=11

SUM=$[$M+`TWOINT`]

echo $SUM

~

[root@ebs-22618 ~]# bash -x sum3.sh

image.png



image.png

$? 是 执行状态结果     因为 没有反引号引用执行返回值,所以 16输出来了,

`` 反引号引用的是执行结果

image.png



# vim adduser2.sh

image.png

#!/bin/bash

#

ADDUSER() {

USERNAME=hadoop

if ! id -u USERNAME &>/dev/null; then

   useradd $USERNAME

   echo $USERNAME | passwd --stdin $USERNAME &> /dev/null

fi

}

ADDUSER

echo $?

image.png


[root@ebs-22618 ~]# chmod +x adduser2.sh

image.png

已经添加它了,它还是0 因为状态返回值是最后一个句话的返回值来决定的

image.png

当 用户存在的时候 id -u hadoop 才是执行的最后一句,它是执行正确的,所以它的返回值是0,所以函数的返回值也是0



[root@ebs-22618 ~]# vim adduser3.sh

#!/bin/bash

#

ADDUSER() {

USERNAME=hadoop

if ! id -u USERNAME &>/dev/null; then

   useradd $USERNAME

   echo $USERNAME | passwd --stdin $USERNAME &> /dev/null

   return 0

else

   return 1

fi

}

ADDUSER

echo $?

image.png

# userdel -r hadoop

image.png

# chmod +x adduser3.sh

image.png

第二次的时候 因为 hadoop存在,所以状态返回值就是1了


[root@ebs-22618 ~]# vim adduser4.sh

#!/bin/bash

#

ADDUSER() {

USERNAME=hadoop

if ! id -u USERNAME &>/dev/null; then

   useradd $USERNAME

   echo $USERNAME | passwd --stdin $USERNAME &> /dev/null

   return 0

else

   return 1

fi

}

ADDUSER

if [ $? -eq 0 ]; then

  echo "add user finished."

else

  echo "Failuer."

fi


image.png


[root@ebs-22618 ~]# chmod +x adduser4.sh

# adduser4.sh

image.png



[root@ebs-22618 ~]# vim twosum.sh

#!/bin/bash

#

TWOSUM(){

 echo $[$1+$2]

}

TWOSUM 5 6

image.png

[root@ebs-22618 ~]# chmod +x twosum.sh


[root@ebs-22618 ~]# ./twosum.sh

11





[root@ebs-22618 ~]# vim twosum.sh

#!/bin/bash

#

TWOSUM(){

 echo $[$1+$2]

}

SUM=`TWOSUM 5 6 `

echo $SUM

image.png

[root@ebs-22618 ~]# ./twosum.sh

11


[root@ebs-22618 ~]# bash -x twosum.sh


image.png






[root@ebs-22618 ~]# vim twosum2.sh

#!/bin/bash

#

TWOSUM(){

 echo $[$1+$2]

}


for I in {1..10}; do

  let  J=$[$I+1]

  TWOSUM $I $J

done

~

~

image.png



[root@ebs-22618 ~]# chmod +x twosum2.sh


[root@ebs-22618 ~]# ./twosum2.sh

image.png



[root@ebs-22618 ~]# vim twosum3.sh

#!/bin/bash

#

TWOSUM(){

 echo $[$1+$2]

}


for I in {1..10}; do

  let  J=$[$I+1]

  echo "$I plus $J is `TWOSUM $I $J`"

done

image.png

[root@ebs-22618 ~]# chmod +x twosum3.sh





# bash twosum3.sh

image.png




[root@ebs-22618 ~]# bash -x twosum3.sh

image.png



[root@ebs-22618 ~]# cp  adduser4.sh adduser5.sh


[root@ebs-22618 ~]# vim adduser5.sh

#!/bin/bash

#

ADDUSER() {

USERNAME=$1

if ! id -u USERNAME &>/dev/null; then

   useradd $USERNAME

   echo $USERNAME | passwd --stdin $USERNAME &> /dev/null

   return 0

else

   return 1

fi

}

ADDUSER hadoop

if [ $? -eq 0 ]; then

  echo "add user finished."

else

  echo "Failuer."

fi

image.png

[root@ebs-22618 ~]# chmod +x adduser5.sh

# userdel -r hadoop

# ./adduser5.sh

image.png




[root@ebs-22618 ~]# cp adduser5.sh adduser6.sh

[root@ebs-22618 ~]# vim adduser6.sh

#!/bin/bash

#

ADDUSER() {

USERNAME=$1

if ! id -u USERNAME &>/dev/null; then

   useradd $USERNAME

   echo $USERNAME | passwd --stdin $USERNAME &> /dev/null

   return 0

else

   return 1

fi

}

for I in {1..10}; do

ADDUSER user$I

if [ $? -eq 0 ]; then

  echo "add user$I finished."

else

  echo "addd user$I Failuer."

fi

done

image.png



[root@ebs-22618 ~]# chmod +x adduser6.sh


[root@ebs-22618 ~]# ./adduser6

image.png



删两个看看

# userdel -r u user1

# userdel -r u user7


image.png





[root@localhost ~]# vim ping.sh

#!/bin/bash

#

PING(){

  for I in {200..254}; do

    if ping -c 1 -W 1 192.168.0.$I &>/dev/null; then

      echo  "192.168.0.$I is up"

    else

      echo  "192.168.0.$I is down"

    fi

  done

}


PING

~

image.png


[root@localhost ~]# chmod +x ping.sh

[root@localhost ~]# ./ping.sh

image.png



[root@localhost ~]# cp ping.sh ping2.sh

[root@localhost ~]# vim ping2.sh

image.png





[root@localhost ~]# cp ping2.sh ping3.sh

[root@localhost ~]# vim ping3.sh

#!/bin/bash

#

PING(){

    if ping -c 1 -W 1 .$1 &>/dev/null; then

      return 0

    else

      return 1

    fi

}


for I in {200..204};do

  PING 192.168.0.$I

  if [ $? -eq 0 ]; then

    echo "192.168.0.$I i up."

  else

    echo "192.168.0.$I i down."

  fi

done


#for I in {220..204};do

#  PING 172.16.100.$I

#done

~

image.png


[root@localhost ~]# ./ping3.sh

image.png






[root@localhost ~]# cp ping3.sh ping4.sh

[root@localhost ~]# vim ping4.sh

#!/bin/bash

#

PING(){

    if ping -c 1 -W 1 .$1 &>/dev/null; then

      return 0

    else

      return 1

    fi

}


for I in {200..204};do


  if PING 192.168.0.$I; then

    echo "192.168.0.$I i up."

  else

    echo "192.168.0.$I i down."

  fi

done


#for I in {220..204};do

#  PING 172.16.100.$I

#done

~

image.png





普通分类: