bash shell脚本练习

  1. 用for实现判断/var目录下所有文件的类型

    	#!/bin/bash
    	#
    	for i in $(find /var); do
    	if [ -b $i ];then
    	echo "$i is block device"
    	elif [ -c $i ]; then
    	echo "$i is character device"
    	elif [ -f $i ]; then
    	echo "$i is normal file"
    	elif [ -h $i ]; then
    	echo "$i is symbol link file"
    	elif [ -p $i ]; then
    	echo "$i is pipe file"
    	elif [ -S $i ]; then
    	echo "$i is socket file"
    	elif [ -d $i ]; then
    	echo "$i is directory file"
    	else
    	echo "file or directory not exist"
    	fi
    	done
    	exit 0
    

    2.添加10个用户user1-user10,密码为8为随机密码

    tr -cd [[:alnum:]]!#@] < /dev/urandom表示从随机数中取出包含[[:alnum:]]!#@]这些字符的内容
    tr -cd [[:alnum:]]!#@] < /dev/urandom |head -c 8表示从上面取出的内容中取头8个字符
    #!/bin/bash
    for n in $(seq 1 10);do
    name=user$n
    useradd "$name"
    echo "$(tr -cd [[:alnum:]]!_#@] < /dev/urandom |head -c 8)" |passwd --stdin $name &> /dev/null
    echo "User create"
    done
    exit 0
    

3.编写脚本,提示请输入网络地址,如:192.168.0.0,判断输入的网段中主机在线状态(执行ctrl+c,kill 进程号,方可退出)

#!/bin/bash
trap 'echo "quit...";kill -9 $(pgrep -f $0)'  INT
read -p "please input the IP ,such as 192.168.0.0" IP
net=$(echo $IP |cut -d "." -f1-2)
for i in {0..254};do
        for j in {0..254};do
                netip="$net.$i.$j"
                ping -c1 -w1 $netip &>/dev/null && echo "$netip is up" || echo "$netip is down"
        done
done

4.打印九九乘法表(\t表示横向跳到下一个制表符位置,echo表示换行,-e表示启用反斜杠转义的解释,-n表示不输出尾随新行)

#!/bin/bash

## 9x9

for i in {1..9} ; do
for j in $(seq $i) ; do
        #echo "j"=$j
echo -en "${i}*${j}=$[$i*$j]\t"
done
echo
done

5.在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如1abcd1234.html

#!/bin/bash

for I in {1..10};do
        filename=$( echo "$I$(tr -cd [:alpha:]</dev/urandom |head -c 8).html") 
        #这种写法也可以  filename=$(echo "$I$(cat /dev/urandom |tr -cd [:alpha:] |head -c 8).html")
        touch /testdir/$filename
        echo "$filename is created"
done

6.猴子吃桃,第一天摘下若干桃子,吃了一半,接着又吃一个,第二天接着吃了一半,接着又吃了一个,这样一直到第十天,只有一个桃子,第一天一共摘了多少?
#解释:猴子一共吃了9天桃子,反推第九天桃子数量(第十天桃子为1+1)2,第八天桃子数量(第九天桃子+1)2,第一天桃子数量(第二天桃子+1)2,按照这个规律进行了9次。

[root@hadoop001 shell]# cat taozi.sh 
#!/bin/bash

sum=1
for I in {1..9};do
        let sum=(sum+1)*2
done
    echo "第一天一共摘了桃子数为:$sum"

7.编写函数实现两个数字作为参数,返回最大值

#!/bin/bash

max(){
        if [ $# -ne 2 ];then
                echo "please input two digits"
                exit 1
        else
                if [[ $1 =~ ^[0-9]+$ ]] && [[ $2 =~ ^[0-9]+$ ]];then
                        if [ $1 -lt $2 ];then
                                echo "the max is $2"
                        else
                                echo "tht max is $1"
                        fi
                else
                        echo "please enter legal number"
                        exit 2
                fi
        fi
}

        max  $1  $2

8.用文件名作为参数,统计所有文件的总行数(要理解shift作用)

#!/bin/bash

sum=0
while(( $# > 0 ));do
        num=$(cat $1|wc -l)
        sum=$[$sum+$num]
        shift

done

echo "总行数为:" $sum

9.每隔3秒钟到系统上获取已经登录的⽤户的信息;如果发现⽤户
hadoop登录, 则将登录时间和主机记录于⽇志/var/log/login.log中,并
退出脚本

#!/bin/bash

if [ ! -e /var/log/login.log ];then
        touch /var/log/login.log
echo "create /var/login.log file"
fi
until false ;do
        if  who |grep  "hadoop" &>/dev/null ;then
##这里要注意,if是没有[],一旦有了会报错,所以需要仔细理解if的
                who |grep "hadoop"  >> /var/log/login.log
                break
        fi 
        sleep 3
done

10.用户在1-39内输入n个数,系统将随机生成且不重复的n个数

#!/bin/bash

read  -p  "enter a element numbers[1-39]" ELENUM

declare  -a  ARRAY

function COMELE {
        for J  in `seq 0 $[${#ARRAY[*]}-1]`; do
                if [ "$1" -eq ${ARRAY[$J]} ];then
                        return  1
                fi
#       echo "xxx"
        done

        return  0

}

for I  in `seq 0 $[$ELENUM-1]`;do
        while true ;do
                NUM=$[$RANDOM%40]
                COMELE  $NUM
                if [ $? -eq 0 ];then
                        break
                fi
        done
        ARRAY[$I]=$NUM
        echo "${ARRAY[$I]}"
done

11.写一个脚本,脚本可以接受选项(i,I,a),完成以下任务:
(1),使用以下形式:getinterface.sh [-i interface | -I IP |-a]
(2).当用户使用-i选项时,显示其指定网卡的IP地址
(3)当用户使用I选项时,显示其后面的ip地址所属的网络接口
(4)当用户单独使用-ax选项时,显示所有网络接口及其IP地址(lo除外)

	#!/bin/bash

SHOWIP(){
        if ! ifconfig |grep -o "^[^[:space:]]\{1,\}"|grep "$1" &>/dev/null;then
        return 11
        fi
        echo -n "$1:"
         ifconfig  $1 |grep -o "inet [0-9\.]\{1,\}"|cut -d " "  -f 2
}

SHOWETHER() {

        if     ! ifconfig |grep -o "inet [0-9\.]\{1,\}"|cut -d " "  -f 2 |grep "$1" &>/dev/null;then
                return 12
        fi
        echo -n "$1:"
        ifconfig  |grep -B 1 "$1" |grep -o "^[^[:space:]]\{1,\}" |cut -d:  -f 1
}

USAGE() {
        echo "getinterface.sh <-i interface|I IP>"
}


SHOWALL(){
        for N in $(ifconfig |grep -o "^[^[:space:]]\{1,\}"|cut -d: -f 1);do
        if [ $N != "lo" ];then
        echo "$N:$(ifconfig  $N |grep -o "inet [0-9.]\{1,\}"|cut -d" " -f2)"
        fi
		done
}


while getopts ":i:I:a" SWITH;do
        case $SWITH in
        i)
        SHOWIP $OPTARG
        [ $? -eq 11 ] && "wrong ehtercard"
        ;;
        I)
        SHOWETHER $OPTARG
        [ $? -eq 12 ] && "wrong IP "
        ;;
        a)
        SHOWALL
        ;;
        \?)
        USAGE;;
        esac

done

12.从给定的一个数据集合中,找到最大的一个数

#!/bin/bash

ARRAY=(11  33  567  98   24   984   345  216  189  401)

declare  -i  MAX=${ARRAY[0]}

index=$[${#ARRAY[*]}-1]
for i  in  `seq 1 $index`;do
        if [ $MAX -lt ${ARRAY[$i]} ];then
                MAX=${ARRAY[$i]}
        fi
done

        echo $MAX

13.从给定的一组数组中的数据,排序

	#!/bin/bash

ARRAY=(11  33  567  98   24   984   345  216  189  401)

for i in `seq 0 $[${#ARRAY[*]}-1]`;do
        for j in `seq $i  $[${#ARRAY[*]}-1]`;do
                if [ ${ARRAY[$i]} -lt ${ARRAY[$j]} ] ;then
                        sum=${ARRAY[$i]}
                        ARRAY[$i]=${ARRAY[$j]}
                        ARRAY[$j]=$sum
                fi
        done
        echo -n "${ARRAY[$i]}   "
done

echo 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值