shell控制的函数与数组练习题

一、函数

练习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

结果为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值