一、函数
练习1:将一个点分十进制格式的IP地址转换成点分二进制格式。比如 255.255.255.255 --> 11111111.11111111.11111111.11111111
代码
decimal_to_bin() {
NUM=$1
for i in {1..8}
do
SUM=$[NUM % 2]$SUM
let NUM/=2
done
echo $SUM
}
# 定义一个分割IP的函数
split_ip() {
IP=$1
for i in {1..4}
do
num=${IP%%.*} # 取十进制最左边的十进制,如192
IP=${IP#*.} # 取十进制从第二个开始到最右边,如168.72.150
BIN=$(decimal_to_bin num)
echo -n "$BIN."
done
}
read -p "Please enter a valid IP address: " INIP
res=$(split_ip $INIP)
echo ${res%.*} # 用于删除二进制最右边的点,%.*代表从字符串的右边开始删除,删到第一个点为止
运行结果
练习2:写一个脚本,判定192.168.48.130-192.168.48.130之间的主机哪些在线,要求:
- 使用函数来实现一台主机的判定过程
- 在主程序中来调用此函数判定指定范围内的所有主机的在线情况
online() {
for i in {1..130}; do
if ping -c 1 $1.$i &>/dev/null
then
echo "$1.$i is up"
else
echo "$1.$i is unknown"
fi
done
}
online $1
运行结果

练习3:编写脚本,使用函数完成如下功能:
- 函数能够接受一个参数,参数为用户名
- 判断一个用户是否存在
- 如果存在,就返回此用户的shell和UID,并返回正常状态值
- 如果不存在,就说此用户不存在,并返回错误状态值
- 在主程序中调用函数
#!/bin/bash
user() {
if id $1 &>/dev/null
then
echo "`grep ^$1 /etc/passwd | cut -d: -f3,7`"
return 0
else
echo "$1 does not exist"
return 1
fi
}
read -p "please input username:" username
until [ "$username" = "quit" -o "$username" = "exit" -o "$username" = "q" ]
do
user $username
if [ $? == 0 ]; then
read -p "please input again:" username
else
read -p "no $username, Please input again:" username
fi
done
运行结果

练习4:根据用户输入的数值计算该数的阶乘(5以内)
fact() {
local sum=1
local n=$1
for ((i=1; i<=n; i++)); do
sum=$((sum * i))
done
echo "$sum"
}
if [ $# -eq 0 ]; then
read -p "请输入一个非负整数,计算其阶乘: " num
else
num=$1
fi
result=$(fact "$num")
echo " $num 的阶乘是: $result"
运行结果

练习5:使用函数递归目录/var/log,如果是文件直接输出文件名,
如果是目录,则输出目录名且输出此目录下的所有目录和文件名
listf () {
for f in $(ls $1)
do
if [ -d "$1/$f" ]; then
echo "$2 directory $f"
listf "$1/$f" " $2"
else
echo "$2 file $f"
fi
done
}
运行结果
二、数组
数组练习1:从“标准输入”读入n次字符串,每次输入的字符串保存在数组array里
i=0
n=5
while [ "$i" -lt $n ];do
echo "Please input strings... `expr $i + 1`"
read array[$i]
b=${array[$i]}
echo "$b"
i=`expr $i + 1`
done
运行结果

数组练习2:将字符串里的字母逐个放入数组,并输出到“标准输出”
chars='afjlksjdfljsldjflsdfj'
for ((i=0;i<${#chars};i++));do
array[$i]=${chars:$i:1} #数组切片 {chars:$i:1} chars是数组,$i是起始位置,1 切片大小
echo ${array[$i]}
done
运行结果

数组练习3:把1-3这3个数字存到数组里,分别乘以8然后依次输出。
#!/bin/bash
array=(`seq 3`)
for ((i=0;i<${#array[@]};i++))
do
echo $[${array[$i]}*8]
done
运行结果

数组练习4:打印这句话中字母数不大于6的单词:cat is favorite to eat fish
array=(cat is favorite to eat fish)
for i in ${array[*]}
do
if [ ${#i} -lt 6 ]
then
echo $i
fi
done
结果为

1万+

被折叠的 条评论
为什么被折叠?



