#!/bin/bash
# 等腰三角形
read -p "Please input the length: " n
for i in `seq 1 $n` do for ((j=$n;j>i;j--)) do echo -n " " done for m in `seq 1 $i` do echo -n "* " done echo done # 倒直角三角形 read -p "Please input the length: " len for i in `seq 1 $len` do for j in `seq $i $len` do echo -n "* " done echo done # 直角三角形 read -p "Please input the length: " len for i in `seq 1 $len` do for((j=1;j<=$i;j++)) do echo -n "* " done echo done # 菱形 read -p "Please input the length: " n for i in `seq 1 $n` do for ((j=$n;j>i;j--)) do echo -n " " done for m in `seq 1 $i` do echo -n "* " done echo done for i in `seq 1 $n` do for((j=1;j<=$i;j++)) do echo -n " " done for((k=$i;k<=$len-1;k++)) do echo -n "* " done echo done
#!/bin/bash
while :
doread -p "Please enter a positive integer: " n if [ $n -lt 1 ] then echo "It can't be less than 1" else break fi done num=1 for i in `seq 2 $n` do num=$[$num+$i] done echo $num
【腳本6】拷貝目錄
編寫shell腳本,把/root/目錄下的所有目錄(只需要一級)拷貝到/tmp/目錄下:
#!/bin/bash
cd /root/
list=(`ls`)for i in ${list[@]} do if [ -d $i ] then cp -r $i /tmp/ fi done
#!/bin/bash
group=`cat /etc/group |grep -o users`
if [ $group == "users" ]
then for i in `seq 0 100` do if [ $i -lt 10 ] then useradd -g users user_0$i else useradd -g users user_$i fi done else echo "users group not found!" exit 1 fi
刪除以上腳本批量添加的用戶:
#!/bin/bash
for i in `seq 0 100`
doif [ $i -lt 10 ] then userdel -r user_0$i else userdel -r user_$i fi done
#!/bin/bash
count=0
# 這個循環會遍歷出每個進程占用的內存大小
for i in `ps aux |awk '{print $6}' |grep -v 'RSS'` do # 將遍歷出來的數字進行累加 count=$[$count+$i] done # 就得到所有進程占用內存大小的和了 echo "$count/kb"
也可以使用awk 一條命令計算:
ps aux |grep -v 'RSS TTY' |awk '{sum=sum+$6};END{print sum}'
#!/bin/bash
now=`date +%F_%T`
mkdir /tmp/123_$now
for txt in `ls /123/*.txt`
do mv $txt $txt.bak for f in $txt do cp $txt.bak /tmp/123_$now done done cd /tmp/ tar czf 123.tar.gz 123_$now/ for txt in `ls /123/*.txt.bak` do name=`echo $txt |awk -F '.' '{OFS="."} {print $1,$2}'` mv $txt $name done
#!/bin/bash
email="user@example.com"
if netstat -lntp |grep ':80' |grep 'httpd' then echo "80 port no problem" exit else /usr/local/apache2.4/bin/apachectl restart python mail.py $email "check_80port" "The 80 port is down." n=`ps aux |grep httpd|grep -cv grep` if [ $n -eq 0 ] then /usr/local/apache2/bin/apachectl start 2>/tmp/apache_start.err fi if [ -s /tmp/apache_start.err ] then python mail.py $mail 'apache_start_error' `cat /tmp/apache_start.err` fi fi
#!/bin/bash
/usr/bin/systemctl start dockerfor i in `docker ps -a |grep 'Exited' |awk '{print $1}'` do /usr/bin/docker start $i done
【腳本18】刪除文本中的字母
要求:把一個文本文檔的前5行中包含字母的行刪除掉,同時把6到10行中的全部字母刪除掉。
參考答案:假設文本名字叫做1.txt,并且文本行數大于10,腳本如下:
#!/bin/bash## 先獲取該文本的行數
rows=`wc -l 1.txt |awk '{print $1}'`## 對前5行進行處理 for i in `seq 1 5` do ## 使用sed把每一行的內容賦值給變量 row=`sed -n "$i"p 1.txt` ## 用grep 判定是否匹配字母,-v取反,-q不輸出內容 if echo $row |grep -vq '[a-zA-Z]' then echo $row fi done ## 對6-10行做刪除字母處理 for i in `seq 6 10` do row=`sed -n "$i"p 1.txt` echo $row |sed 's/[a-zA-Z]//g' done ## 剩余的直接輸出 for i in `seq 11 $rows` do sed -n "$i"p 1.txt done ##若想把更改內容寫入到1.txt,還需要把以上內容重定向到一個文本中,然后刪除1.txt,再把剛剛重定向的文件更名為1.txt
【腳本19】查找字母數小于6的單詞
用shell打印下面這句話中字母數小于6的單詞。 Bash also interprets a number of multi-character options.
腳本如下:
#!/bin/bash
for s in Bash also interprets a number of multi-character options
don=`echo $s |wc -c` if [ $n -lt 6 ] then echo $s fi done
【腳本20】輸入數字執行對應命令
寫一個腳本實現如下功能: 輸入一個數字,然后運行對應的一個命令。顯示命令如下:
*cmd meau** 1—date 2–ls 3–who 4–pwd
當輸入1時,會運行date, 輸入2時運行ls, 依此類推。
實現腳本如下:
#!/bin/bash
echo "*cmd meau** 1—date 2–ls 3–who 4–pwd"read -p "please input a number 1-4: " n case $n in 1) date ;; 2) ls ;; 3) who ;; 4) pwd ;; *) echo "Please input a number: 1-4" ;; esac
#!/bin/bashcheck_service(){n=0for i in `seq 1 5` do # apachectl命令所在路徑 /usr/local/apache2/bin/apachectl restart 2> /tmp/apache.err if [$? -ne 0 ] then n=$[$n-1] else break fi done if [ $n -eq 5 ] then ## mail.py的內容參考https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py python mail.py "123@qq.com" "httpd service down" `cat /tmp/apache.err` exit fi } while : do t_n=`ps -C httpd --no-heading |wc -l` if [ $t_n -ge 500 ] then /usr/local/apache2/bin/apachectl restart if [ $? -ne 0 ] then check_service fi sleep 60 t_n=`ps -C httpd --no-heading |wc -l` if [ $t_n -ge 500] then python mail.py "123@qq.com" "httpd service somth wrong" "the httpd process is budy." exit fi fi sleep 10 done
#!/bin/bash
## This script is for record Filesystem Use%,IUse% everyday and send alert mail when % is more than 85%.log=/var/log/disk/`date +%F`.log
date +'%F %T' > $log df -h >> $log echo >> $log df -i >> $log for i in `df -h|grep -v 'Use%'|sed 's/%//'|awk '{print $5}'`; do if [ $i -gt 85 ]; then use=`df -h|grep -v 'Use%'|sed 's/%//'|awk '$5=='$i' {print $1,$5}'` echo "$use" >> use fi done if [ -e use ]; then ##這里可以使用咱們之前介紹的mail.py發郵件 mail -s "Filesystem Use% check" root@localhost < use rm -rf use fi for j in `df -i|grep -v 'IUse%'|sed 's/%//'|awk '{print $5}'`; do if [ $j -gt 85 ]; then iuse=`df -i|grep -v 'IUse%'|sed 's/%//'|awk '$5=='$j' {print $1,$5}'` echo "$iuse" >> iuse fi done if [ -e iuse ]; then mail -s "Filesystem IUse% check" root@localhost < iuse rm -rf iuse fi
#!/bin/bashn=`wc -l a.txt|awk '{print $1}'`
sum=0
for i in `seq 1 $n` do line=`sed -n "$i"p a.txt` n_n=`echo -n $line|sed 's/[^0-9]//g'|wc -c` echo line $i number: $n_n sum=$[$sum+$n_n] done echo sum is $sum
#!/bin/bash
#written by aming.if [ $# -eq 0 -o $# -gt 2 ] then echo "use $0 --add username or $0 --del username or $0 --help." exit 1 fi case $1 in --add) n=0 for u in `echo $2|sed 's/,/ /g'`; do if awk -F: '{print $1}' /etc/passwd |grep -qw "$u" then echo "The user $u exist." else useradd $u echo -e "$u\n$u"|passwd $u >/dev/null 2>&1 echo "The user $u added successfully." n=$[$n+1] fi done if [ $n -eq 0 ]; then exit 2 fi ;; --del) n=0 for u in `echo $2|sed 's/,/ /g'`; do if awk -F: '{print $1}' /etc/passwd|grep -qw "$u" then userdel -r $u echo "The user $u deleted successfully." n=$[$n+1] else echo "The user $u not exist." fi done if [ $n -eq 0 ]; then exit 3 fi ;; --help) echo -e "--add can add user,and the passwd is the same as username. It can add multiuser such as --add user1,user2,user3..." echo "--del cat delete user.It can delete user such as --del user1,user2,user3..." ;; *) echo "use $0 --add username or $0 --del username or $0 --help." exit 1 ;; esac
【腳本38】被3整除
寫一個腳本: 計算100以內所有能被3整除的正整數的和
代碼參考:
#!/bin/bash
sum=0
for i in {1..100};doif [ $[$i%3] -eq 0 ];then sum=$[$i+$sum] fi done echo "sum:$sum"
【腳本39】腳本傳參
使用傳參的方法寫個腳本,實現加減乘除的功能。例如: sh a.sh 1 2,這樣會分別計算加、減、乘、除的結果。
要求:
腳本需判斷提供的兩個數字必須為整數
當做減法或者除法時,需要判斷哪個數字大
減法時需要用大的數字減小的數字
除法時需要用大的數字除以小的數字,并且結果需要保留兩個小數點。
參考代碼:
#!/bin/bashif [ $# -ne 2 ]
then echo "The number of parameter is not 2, Please useage: ./$0 1 2" exit 1 fi is_int() { if echo "$1"|grep -q '[^0-9]' then echo "$1 is not integer number." exit 1 fi } max() { if [ $1 -ge $2 ] then echo $1 else echo $2 fi } min() { if [ $1 -lt $2 ] then echo $1 else echo $2 fi } sum() { echo "$1 + $2 = $[$1+$2]" } minus() { big=`max $1 $2` small=`min $1 $2` echo "$big - $small = $[$big-$small]" } mult() { echo "$1 * $2 = $[$1*$2]" } div() { big=`max $1 $2` small=`min $1 $2` d=`echo "scale =2; $big / $small"|bc` echo "$big / $small = $d" } is_int $1 is_int $2 sum $1 $2 minus $1 $2 mult $1 $2 div $1 $2
【腳本40】用戶交互腳本
寫一個腳本,執行后,打印一行提示“Please input a number:”,要求用戶輸入數值,然后打印出該數值,然后再次要求用戶輸入數值。直到用戶輸入”end”停止。
代碼參考:
#!/bin/bashwhile :
doread -p "Please input a number:(end for exit) " n num=` echo $n |sed -r 's/[0-9]//g'|wc -c ` if [ $n == "end" ] then exit elif [ $num -ne 1 ] then echo "what you input is not a number!Try again!" else echo "your input number is: $n" fi done
#!/bin/bash
m=`echo $RANDOM`
n1=$[$m%100]
while : do read -p "Please input a number: " n if [ $n == $n1 ] then break elif [ $n -gt $n1 ] then echo "bigger" continue else echo "smaller" continue fi done echo "You are right."
while :
doread -p "Please input a name:" nameif [ -f /work/test/1.log ];then bb=`cat /work/test/1.log | awk -F: '{print $1}' | grep "$name"` if [ "$bb" != "$name" ];then #名字不重復情況下 aa=`echo $RANDOM | awk -F "" '{print $2 $3}'` while : do dd=`cat /work/test/1.log | awk -F: '{print $2}' | grep "$aa"` if [ "$aa" == "$dd" ];then #數字已經存在情況下 echo "數字已存在." aa=`echo $RANDOM | awk -F "" '{print $2 $3}'` else break fi done echo "$name:$aa" | tee -a /work/test/1.log else aa=`cat /work/test/1.log | grep "$name" | awk -F: '{print $2}'` #名字重復 echo $aa echo "重復名字." fi else aa=`echo $RANDOM | awk -F "" '{print $2 $3}'` echo "$name:$aa" | tee -a /work/test/1.log fi done
【腳本46】打印只有一個數字的行
如題,把一個文本文檔中只有一個數字的行給打印出來。
參考代碼:
#!/bin/bashf=/etc/passwd
line=`wc -l $f|awk '{print $1}'`
for l in `seq 1 $line`; do n=`sed -n "$l"p $f|grep -o '[0-9]'|wc -l`; if [ $n -eq 1 ]; then sed -n "$l"p $f fi done
#!/bin/baships="192.168.1."
for i in `seq 1 254`
do ping -c 2 $ips$i >/dev/null 2>/dev/null if [ $? == 0 ] then echo "echo $ips$i is online" else echo "echo $ips$i is not online" fi done
#!/bin/bash
sh -n $1 2>/tmp/err
if [ $? -eq "0" ] then echo "The script is OK." else cat /tmp/err read -p "Please inpupt Q/q to exit, or others to edit it by vim. " n if [ -z $n ] then vim $1 exit fi if [ $n == "q" -o $n == "Q" ] then exit else vim $1 exit fi fi
【腳本50】格式化輸出
輸入一串隨機數字,然后按千分位輸出。
比如輸入數字串為“123456789”,輸出為123,456,789
代碼參考:
#!/bin/bashread -p "輸入一串數字:" num
v=`echo $num|sed 's/[0-9]//g'` if [ -n "$v" ] then echo "請輸入純數字." exit fi length=${#num} len=0 sum='' for i in $(seq 1 $length) do len=$[$len+1] if [[ $len == 3 ]] then sum=','${num:$[0-$i]:1}$sum len=0 else sum=${num:$[0-$i]:1}$sum fi done if [[ -n $(echo $sum | grep '^,' ) ]] then echo ${sum:1} else echo $sum fi
上面這個實現比較復雜,下面再來一個sed的:
#!/bin/bash
read -p "輸入一串數字:" num
v=`echo $num|sed 's/[0-9]//g'` if [ -n "$v" ] then echo "請輸入純數字." exit fi echo $num|sed -r '{:number;s/([0-9]+)([0-9]{3})/\1,\2/;t number}'
【腳本51】
1 編寫一個名為iffile程序,它執行時判斷/bin目錄下date文件是否存在?
參考代碼:
#!/bin/bash
if [ -f /bin/date ]
thenecho "/bin/date file exist." else echo "/bin/date not exist." fi
#!/bin/bash
read -p "Please input the username: " user
while :
do if who | grep -qw $user then echo $user login. else echo $user not login. fi sleep 300 done
#!/bin/bashget_a_num() {n=$[$RANDOM%10]echo $n } get_numbers() { for i in 1 2 3; do a[$i]=`get_a_num` done echo ${a[@]} } if [ -n "$1" ]; then m=`echo $1|sed 's/[0-9]//g'` if [ -n "$m" ]; then echo "Useage bash $0 n, n is a number, example: bash $0 5" exit else for i in `seq 1 $1` do get_numbers done fi else get_numbers fi
#!/bin/bashread -p "請輸入您想要暫停的數字:" number_1for i in `seq 1 $number_1`; do echo $i done read -p "是否繼續輸入數字?" a if [ $a == "yes" ];then read -p "請繼續輸入您想要暫停的數字:" number_2 number_3=$[$number_1+1] if [ $number_2 -gt $number_1 ];then for h in `seq $number_3 $number_2`; do echo $h done else echo "輸入數字錯誤,請輸入大于的數字!" fi else exit fi
【腳本66】給文檔增加內容
在文本文檔1.txt第5行(假設文件行數大于5)后面增加如下內容:
# This is a test file.# Test insert line into this file.
參考命令:
sed -i "5a # This is a test file.\n# Test insert line into this file." 1.txt
#!/bin/sh if [ ! -d /root/bak ]
thenmkdir /root/bak
fi prefix=`date +%y%m%d` d=`date +%d` if [ $d == "01" ] then cd /etc/ tar czf /root/bak/$prefix_etc.tar.gz ./ fi
#!/bin/bash
f=members.txt
n=`wc -l $f|awk '{print $1}'`
get_n() { l=`echo $1|wc -c` n1=$RANDOM n2=$[$n1+$l] g_id=$[$n1%7] if [ $g_id -eq 0 ] then g_id=7 fi echo $g_id } for i in `seq 1 7` do [ -f n_$i.txt ] && rm -f n_$i.txt done for i in `seq 1 $n` do name=`sed -n "$i"p $f` g=`get_n $name` echo $name >> n_$g.txt done nu(){ wc -l $1|awk '{print $1}' } max(){ ma=0 for i in `seq 1 7` do n=`nu n_$i.txt` if [ $n -gt $ma ] then ma=$n fi done echo $ma } min(){ mi=50 for i in `seq 1 7` do n=`nu n_$i.txt` if [ $n -lt $mi ] then mi=$n fi done echo $mi } ini_min=1 while [ $ini_min -le 7 ] do m1=`max` m2=`min` ini_min=m2 for i in `seq 1 7` do n=`nu n_$i.txt` if [ $n -eq $m1 ] then f1=n_$i.txt elif [ $n -eq $m2 ] then f2=n_$i.txt fi done name=`tail -n1 $f1` echo $name >> $f2 sed -i "/$name/d" $f1 ini_min=$[$ini_min+1] done for i in `seq 1 7` do echo "$i 組成員有:" cat n_$i.txt echo done
#!/bin/bashif [ $# -ne 2 ]
then echo "useage $0 dir word" exit 1 fi if [ -d $1 ] then cd $1 else echo "$1目錄不存在" exit 1 fi for f in `ls $1` do if [ -d $f ] then if [ -f $f/test.txt ] then n=`grep -cw "$2" $f/test.txt` echo "$1/$f/test.txt 里面有$n個$2" else echo "$1/$f 下面沒有test.txt" fi fi done
【腳本82】打印正方形
交互式腳本,根據提示,需要用戶輸入一個數字作為參數,最終打印出一個正方形。
在這里我提供一個linux下面的特殊字符■,可以直接打印出來。
示例: 如果用戶輸入數字為5,則最終顯示的效果為:
■ ■ ■ ■ ■■ ■ ■ ■ ■■ ■ ■ ■ ■■ ■ ■ ■ ■■ ■ ■ ■ ■
參考代碼:
#!/bin/bashread -p "please input a number:" sum
a=`echo $sum |sed 's/[0-9]//g'` if [ -n "$a" ] then echo "請輸入一個純數字。" exit 1 fi for n in `seq $sum` do for m in `seq $sum` do if [ $m -lt $sum ] then echo -n "■ " else echo "■" fi done done
【腳本83】問候用戶
寫一個腳本,依次向/etc/passwd中的每個用戶問好,并且說出對方的ID是什么:
Hello,root,your UID is 0.
參考命令:
awk -F ':' '{print "Hello,"$1",your uid is "$3.}' /etc/passwd
#!/bin/bashfind /data/log -name “*.log” -mtime +3 > /tmp/file.list
cd /data/log
tar czvf log.tar.gz `cat /tmp/file.list|xargs`
rsync -a log.tar.gz 192.168.1.2:/data/log # 這一步需要提前做一個免密碼登錄 for f in `cat /tmp/file.list` do rm -f $f done