shell script练习
执行脚本的几种方式:
1. sh a.sh 或者 bash a.sh 调用的是 /bin/bash 进程执行的,所以脚本不需要执行权限。
2. 直接使用绝对路径执行, /home/script/a.sh ,脚本需要有执行权限,如果没有权限可执行 chmod a+x a.sh 加入执行权限。
(lampp启动数据库用的就是: /opt/lampp/lampp startmysql )
sh03.sh 根据时间创建目录
#!/bin/bash echo -e "I will use 'touch' command to create 3 files." read -p "Please input your filename:" fileuser filename=${fileuser:-"filename"} echo $filename date1=$(date -d '-2 day' +%Y%m%d) #前两天的日期 date2=$(date -d '-1 day' +%Y%m%d) #前一天的日期 date3=$(date "+%Y%m%d") #下面三行在配置文件名 file1=${filename}${date1} file2=${filename}${date2} file3=${filename}${date3} touch "$file1" touch "$file2" touch "$file3"
sh04.sh 数字运算
#!/bin/bash echo -e "You SHOULD input 2 numbers,I will cross them!\n" read -p "first number: " firstnu read -p "second number: " secnu total=$(($firstnu*$secnu)) echo -e "\n The result of $firstnu x $secnu is ==> $total"
sh05.sh 使用 test 判断文件存在和权限
echo -e "Please input a filename,I will check the filename's type and permission. \n\n" read -p "Input a filename : " filename test -z $filename && echo "You MUST input a filename." && exit 0 test ! -e $filename && echo "The filename '$filename' DO NOT exist" && exit 0 test -f $filename && filetype="regulare file" test -d $filename && filetype="directory" test -r $filename && perm="readable" test -w $filename && perm="$perm writable" test -x $filename && perm="$perm executable" echo "The filename:$filename is a $filetype" echo "And the permissions are : $perm"
sh06.sh 使用 [] 中括号做判断
read -p "Please input (Y/N):" yn [ "$yn" == "Y" -o "$yn" == "y" ] && echo "OK,continue" && exit 0 [ "$yn" == "N" -o "$yn" == "n" ] && echo "Oh,interrupt!" && exit 0 echo "I don't know what your choice is" && exit 0
sh07.sh 脚本传参
echo "The script name is ==> $0" echo "Total parameter number is ==> $#" [ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." && exit 0 echo "Your whole parameter is ==> '$@'" echo "The 1st parameter ==> $1" echo "The 2nd parameter ==> $2"
sh08.sh shift去除参数
echo "Total parameter number is ==> $#" echo "Your whole parameter is ==> '$@'" shift # 进行第一次 "一个变量的 shift " echo "Total parameter number is ==> $#" echo "Your whole parameter is ==> '$@'" shift 3 # 进行第二次 "三个变量的 shift " echo "Total parameter number is ==> $#" echo "Your whole parameter is ==> '$@'"
sh06-2.sh if...then 单层判断
read -p "Please input (Y/N):" yn if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then echo "OK,continue" exit 0 fi if [ "$yn" == "N" ] || [ "$yn" == "n" ]; then echo "Oh,interrupt!" exit 0 fi echo "I don't know what your choice is" && exit 0
sh06-3.sh if...elif...else...fi
read -p "Please input (Y/N):" yn if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then echo "OK,continue" exit 0 elif [ "$yn" == "N" ] || [ "$yn" == "n" ]; then echo "Oh,interrupt!" exit 0 else echo "I don't know what your choice is" && exit 0 fi
sh09.sh
if [ "$1" == "hello" ]; then echo "Hello,how ary you?" elif [ "$1" == "" ]; then echo "You MUST input parameters,ex> {$0 someword}" else echo "The only parameter is 'hello',ex> {$0 hello}" fi
sh10.sh
echo "Now,I will detect your Linux server's services!" echo -e "The www, ftp, ssh, and mail will be detect! \n" testing=$(netstat -tuln | grep ":80 ") if [ "$testing" != "" ]; then echo "WWW is running in your system." fi testing=$(netstat -tuln | grep ":22 ") if [ "$testing" != "" ]; then echo "SSH is running in your system." fi testing=$(netstat -tuln | grep ":21 ") if [ "$testing" != "" ]; then echo "FTP is running in your system." fi testing=$(netstat -tuln | grep ":25 ") if [ "$testing" != "" ]; then echo "Mail is running in your system." fi
sh11.sh case...esac 判断
case $1 in "hello") echo "Hello,how are you?" ;; "") echo "You MUST input parameters,ex> {$0 someword}" ;; *) echo "The only parameter is 'hello',ex> {$0 hello}" ;; esac
sh12.sh
echo "This program will print your selection !" read -p "Input your choice: " choice case $choice in #case $1 in "one") echo "Your choice is ONE" ;; "two") echo "Your choice is TWO" ;; "three") echo "Your choice is THREE" ;; *) echo "Usage $0 {one|two|three}" ;; esac
sh12-2.sh 使用function
function printit(){
echo -n "Your choice is " #加上 -n 可以不断行继续在同一行显示
}
echo "This program will print your selection !"
case $1 in
"one")
printit; echo $1 | tr 'a-z' 'A-Z' #将参数做大小写转换!
;;
"two")
printit; echo $1 | tr 'a-z' 'A-Z'
;;
"three")
printit; echo $1 | tr 'a-z' 'A-Z'
;;
*)
echo "Usage $0 {one|two|three}"
;;
esac
sh12-3.sh function带参数
function printit(){ echo -n "Your choice is $1" #加上 -n 可以不断行继续在同一行显示 } echo "This program will print your selection !" case $1 in "one") printit 1; ;; "two") printit 2; ;; "three") printit 3; ;; *) echo "Usage $0 {one|two|three}" ;; esac
sh13.sh while do done循环
read -p "Please input yes/YES to stop this program:" yn while [ "$yn" != "yes" -a "$yn" != "YES" ] do read -p "Please input yes/YES to stop this program:" yn done echo "OK! you input the correct answer."
sh13-2.sh until do done循环
until [ "$yn" == "yes" -o "$yn" == "YES" ] do read -p "Please input yes/YES to stop this program:" yn done echo "OK! you input the correct answer."
sh14.sh
s=0 i=0 while [ "$i" != "100" ] do i=$(($i+1)) #每次 i 都会增加1 s=$(($s+$i)) #每次都会累加一次! done echo "The result of '1+2+3+...+100' is ==> $s"
sh15.sh for...do...done循环
for animal in dog cat elephant do echo "There are ${animal}s..." done
sh16.sh
users=$(cut -d ':' -f1 /etc/passwd) #获取账号名称 for username in $users #开始循环进行 do id $username finger $username done
sh17.sh (该shell script需要检查,还有问题)
network="192.168.66" #先定义一个域的前面部分 for sitenu in $(seq 1 255) #seq为sequence(连续)的缩写之意 do #下面的语句取得ping 的回传值是正确的还是失败的 ping -c 1 -w ${network}.${sitenu} &> /dev/null && result=0 || result=1 #开始显示结果是正确的启动(UP) 还是错误的没有连通(DOWN) if [ "$result" == 0 ]; then echo "Server ${network}.${sitenu} is UP." else echo "Server ${network}.${sitenu} is DOWN." fi done
检查网段IP使用情况
#!/bin/bash #main--- network=192.168.1 ping_count=3 IP=1 :>IP_use :>IP_idle :>ping_action echo "`date "+%Y%m%d %H:%M:%S"`----->脚本开始执行......" while [ $IP -lt 255 ] do host=$network.$IP echo "-------->开始检测$host服务器通迅是否正常,ping次数$ping_count." ping $host -c $ping_count >.ping_tmp sleep 1 cat .ping_tmp >>ping_action echo "-------->服务器$host检测已完成." sum_ping=`tail -2 .ping_tmp |head -1 |awk -F, '{print$2}' |cut -c 2-2` loss_ping=`tail -2 .ping_tmp |head -1 |awk -F, '{print$4}'|cut -c 2-5` if [ $sum_ping -eq $ping_count ];then echo "-->$host IP 已经在使用中" echo "-->$host IP 已经在使用中" >>IP_use else echo "$host IP 目前空闲:$loss_ping" echo "$host IP 目前空闲" >>IP_idle fi IP=$((IP+1)) done echo "`date "+%Y%m%d %H:%M:%S"`----->脚本运行完毕......"
sh18.sh 遍历目录下文件的权限
#1.先看看这个目录是否存在啊? read -p "Please input a directory:" dir if [ "$dir" == "" -o ! -d "$dir" ]; then echo "The $dir is NOT exist in your system." exit 1 fi #2.开始测试文件。 filelist=$(ls $dir) #列出所有在该目录下的文件名 for filename in $filelist do perm="" test -r "$dir/$filename" && perm="$perm readable" test -w "$dir/$filename" && perm="$perm writable" test -x "$dir/$filename" && perm="$perm executable" echo "The file $dir/$filename's permission is $perm" done
sh19.sh for...do...done 循环
read -p "Please input a number,I will count for 1+2+...+your_input:" nu s=0 for((i=1;i<=$nu;i=i+1)) do s=$(($s+$i)) done echo "The result of '1+2+3+...+$nu' is ==> $s"