使用read命令来接收输入 使用read来把输入值分配给一个或多个shell变量: -p:指定要显示的提示 -t:timeout read 从标准输入中读取值,给每个单词分配一个变量, 所有剩余单词都被分配给最后一个变量 示例: read -p "Enter a filename: " File 多条件选择if语句 选择执行,if语句可以嵌套 格式: 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件;then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if condition1(条件1);then if-true elif condition2;then if-true elif condition3;then if-true ... else all-false fi 逐条件进行判断,第一次遇为"真"条件时,执行其分支,而后结束整个if语句。 条件判断:case语句 适合离散值。 case 变量引用 in case支持glob风格的通配符 PAT1) *:任意长度任意字符 分支1 ?:任意单个字符 ;; []:指定范围内的任意单个字符 PAT2) a|b:a或b 分支2 ;; ... *) 默认分支 ;; esac 循环语句 循环执行 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 for,while,until for循环 for 变量名 in 列表;do 循环体 done 执行机制: 依次将列表中的元素赋值给"变量名";每次赋值后即执行一次循环体;直到列表中的元素耗尽,循环结束。 列表生产方式: 直接给出列表 整数列表 {start..end} $(seq [start[step]] end) 返回列表的命令 $(COMMAND) 使用glob,如:*.sh 变量引用 $@,$* 函数 - function(){...COMMAND} 格式 - 调用直接写上函数名 break continue 作业
1. 编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。 ``` #/bin/bash HostInfo=`cat /etc/centos-release` HostName=`hostname` IPaddr=` ifconfig | grep "inet addr" | tr -s " " | head -1 | cut -d: -f2 | cut -d " " -f1` OSinfo=`cat /etc/centos-release` KernelInfo=`uname -r` CpuInfo=`cat /proc/cpuinfo | grep "model name" | uniq | cut -d : -f2` MemInfo=`cat /proc/meminfo | grep "MemTotal" | tr -s " "` DiskSpace=`fdisk -l | grep "Disk" | grep /dev/sda | cut -d: -f2 | cut -d , -f1` echo -e "HostInfo:\033[21;31m$HostInfo \033[0m" echo -e "HostName:\033[32m$HostName \033[0m" echo -e "IPaddr:\033[33m$IPaddr \033[0m" echo -e "OSinfo:\033[34m$OSinfo \033[0m" echo -e "KernelInfo:\033[35m$KernelInfo \033[0m" echo -e "MemInfo:\033[36m$MemInfo \033[0m" echo -e "DiskSpace:\033[41;37m$DiskSpace \033[0m" ``` 2. 编写脚本/root/bin/backup.sh,可实现每日将/etc/目录备份到/root/etcYYYY-mm-dd中 > ``` > #/bin/bash > #复制目录就在opt目录下创建etc当天命名的文件夹 > #复制文件就在opt目录下创建etc当天命名的文件 > BackupFile=/opt/etc`date +%F` > cp -r /etc $BackupFile && echo "/etcFile备份完成" > unset BackupFile > ``` 3. 编写脚本/root/bin/disk.sh,显示当前硬盘分区中空间利用率最大的值 > ``` > #/bin/bash > declare -i Use > Use=15 > Disk=`df | grep /dev/sda | tr -s " " | sort -nr -t " " -k5 | head -1 | cut -d " " -f1` > DiskuseSpace=`df | grep /dev/sda | tr -s " " | sort -nr -t " " -k5 | head -1 | cut -d " " -f5` | sed "s/\([[:digit:]]\+\).*/\1/g" > [[ "$DiskuseSpace" -gt "$Use" ]] && echo "磁盘空间不足,注意清理." && echo "空间利用率$Disk是最大值$DiskuseSpace." > unset Use > unset Disk > unset DiskuseSpace > ``` 4. 编写脚本/root/bin/links.sh,显示正连接本主机的每个远程主机的IPv4地址和连接数,并按连接数从大到小排序 > ``` > #/bin/bash > netstat -tn | grep "tcp" | tr -s " " | cut -d " " -f5 | sed "s/\([0-1][0-9][1-9].\)\([0-1][0-9][1-9].\)\([1-9].\)\([0-1][0-9][1-9]\).*/\1\2\3\4/g" | wc -l | sort -nr > ``` 5. 写一个脚本/root/bin/sumid.sh,计算/etc/passwd文件中的第10个用户和第20用户的ID之和 > ``` > #/bin/bash > sum1=`sed -n '10p' /etc/passwd | cut -d: -f3` > sum2=`sed -n `20p` /etc/passwd | cut -d: -f3` > let sum=$sum1+$sum2 > echo "UserID sum is $sum" > ``` 6. 写一个脚本/root/bin/sumspace.sh,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和 > ``` > #/bin/bash > echo "Give a one file Path:$1" > echo "Give a two file Path:$2" > sum1=`grep "^$" $1 | wc -l` > sum2=`grep "^$" $2 | wc -l` > let sum=$sum1+$sum2 > echo $sum > ``` 7. 写一个脚本/root/bin/sumfile.sh,统计/etc, /var, /usr目录中共有多少个一级子目录和文件 > ``` > #/bin/bash > read -p "Enter your FilePath:" A B C > sum1=`ls -rA $A | wc -l` > sum2=`ls -rA $B | wc -l` > sum3=`ls -rA $C | wc -l` > let sum=$sum1+$sum2+$sum3 > echo $sum1 > echo $sum2 > echo $sum3 > echo $sum > ``` 8. 写一个脚本/root/bin/argsnum.sh,接受一个文件路径作为参数;如果参数个数小于1,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数 > ``` > #/bin/bash > read -p "请输入Path:" A > [ -z "$A" ] && echo "至少应该给一个参数"&& exit 13 > [ -n "$A" ] && spaceline=`grep "^$" $A | wc -l` > echo "$spaceline" > ``` 9. 写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问” > ``` > #/bin/bash > ping -c3 $1 &> /dev/null && echo "该ip地址可以访问" || echo "该ip地址不可访问" > ``` 10. chmod -rw /tmp/file1,编写脚本/root/bin/per.sh,判断当前用户对/tmp/fiile1文件是否不可读且不可写 > ``` > #/bin/bash > read -p "Enter a file name:" File > [ -r "$File" -a -w "$File" ] && echo "此用户可读可写!" || echo "此用户不可读且不可写。" > ``` 11. 编写脚本/root/bin/nologin.sh和login.sh,实现禁止和充许普通用户登录系统。 > ``` > #/bin/bash > #ShellName nologin.sh > Nologin=/etc/nologin > [ -e $Nologin ] && echo "已禁止普通用户登录!" || touch $Nologin > ``` > ``` > #/bin/bash > #ShellName login.sh > Login=/etc/nologin > [ -e $Login ] && echo "禁止普通用户登录文件存在。";rm $Login > ``` 12. 写一个脚本/root/bin/hostping.sh,接受一个主机的IPv4地址做为参数,先判断是否合格IP,否,提示IP格式不合法并退出,是,测试是否可连通。如果能ping通,则提示用户“该IP地址可访问”;如果不可ping通,则提示用户“该IP地址不可访问” > ``` > #/bin/bash > #Shell name hostping > #author WZB > echo "请输入一个IP:$1" > [[ -n "$1" ]] && echo "This IP is True!!" && ping -c3 $1 &>/dev/null && echo "$1可以访问" || echo "$1不可以访问" || echo "IP address is false";exit 13 > ``` 13. 计算1+2+3+...+100的值 ``` #/bin/bash #author WZB sum=0 for i in `seq 1 1 100`;do let "sum+=i" done echo "$sum" #echo {1..100} | tr " " "+" | bc ``` 14. 计算从脚本第一参数A开始,到第二个参数B的所有数字的总和,判断B是否大于A,否提示错误并退出,是则计算之 > ``` > #/bin/bash > #author WZB > echo "第一个参数A:$1" > echo "第二个参数B:$2" > > [[ $2 -gt $1 ]] && let sum=$2+$1 && echo "sum的值:$sum" || echo "B不大于A,已退出请重新执行。";exit3 > > unset sum > ``` ``` [[ $1 = ~\b[[:digit:]]+\b ]]匹配任意数字 ``` ``` seq -s(指定分隔符) + 1 10 ```
原创文章,作者:真的可行(wzb),如若转载,请注明出处:http://www.178linux.com/36186