欢迎各位兄弟 发布技术文章
这里的技术是共享的
函数:功能 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就退出
[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
[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
[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
[root@ebs-22618 ~]# chmod +x diskuage2.sh
[root@ebs-22618 ~]# vim sum3.sh
#!/bin/bash
#
TWOINT() {
A=9
B=7
C=$[$A+$B]
echo $C
}
TWOINT
[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
$? 是 执行状态结果 因为 没有反引号引用执行返回值,所以 16输出来了,
`` 反引号引用的是执行结果
# vim adduser2.sh
#!/bin/bash
#
ADDUSER() {
USERNAME=hadoop
if ! id -u USERNAME &>/dev/null; then
useradd $USERNAME
echo $USERNAME | passwd --stdin $USERNAME &> /dev/null
fi
}
ADDUSER
echo $?
[root@ebs-22618 ~]# chmod +x adduser2.sh
已经添加它了,它还是0 因为状态返回值是最后一个句话的返回值来决定的
当 用户存在的时候 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 $?
# userdel -r hadoop
# chmod +x adduser3.sh
第二次的时候 因为 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
[root@ebs-22618 ~]# chmod +x adduser4.sh
# adduser4.sh
[root@ebs-22618 ~]# vim twosum.sh
#!/bin/bash
#
TWOSUM(){
echo $[$1+$2]
}
TWOSUM 5 6
[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
[root@ebs-22618 ~]# ./twosum.sh
11
[root@ebs-22618 ~]# bash -x twosum.sh
[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
~
~
[root@ebs-22618 ~]# chmod +x twosum2.sh
[root@ebs-22618 ~]# ./twosum2.sh
[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
[root@ebs-22618 ~]# chmod +x twosum3.sh
# bash twosum3.sh
[root@ebs-22618 ~]# bash -x twosum3.sh
[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
[root@ebs-22618 ~]# chmod +x adduser5.sh
# userdel -r hadoop
# ./adduser5.sh
[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
[root@ebs-22618 ~]# chmod +x adduser6.sh
[root@ebs-22618 ~]# ./adduser6
删两个看看
# userdel -r u user1
# userdel -r u user7
[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
~
[root@localhost ~]# chmod +x ping.sh
[root@localhost ~]# ./ping.sh
[root@localhost ~]# cp ping.sh ping2.sh
[root@localhost ~]# vim ping2.sh
[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
~
[root@localhost ~]# ./ping3.sh
[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
~