shell腳本之for循環


bash的for循環:

事先提供一個元素列表,而後,使用變量去遍歷此元元素列表;每訪問一個元素,就執行一次循環體;直到元素訪問完畢;


用法格式:

for VAR_NAME in 元素1 元素2 ...; do

語句1;

語句2;

...

done



#!/bin/bash

#


for UserName in user1 user2 user3; do

useradd $UserName

echo $UserName | passwd --stdin $UserName

done


練習1:寫一個腳本,顯示/etc/inittab, /etc/rc.d/rc.sysinit, /etc/fstab三個文件各有多少行;


for FileName in /etc/inittab /etc/rc.d/rc.sysinit /etc/fstab; do

wc -l $FileName

done


練習2:寫一個腳本

使用for循環創建目錄/tmp/1.dir,/tmp/2.dir和/tmp/3.dir,並將它們的權限均修改爲750;


#!/bin/bash


for DirName in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do

mkdir $DirName

chmod 750 $DirName

done


練習3:寫一個腳本

使用for循環修改目錄/tmp/1.dir,/tmp/2.dir和/tmp/3.dir的最近一次修改時間爲2010年3月3號3點3分3秒;

touch命令:

touch FILE

-a FILE

-m FILE

-t STAMP, [CC]YYMMDDhhmm.ss

touch -m -t 201003030303.03 /tmp/1.dir


#!/bin/bash


for Dir in /tmp/1.dir /tmp/2.dir /tmp/3.dir; do

touch -m -t 201003030303.03 $Dir

done


for Dir in 1.dir 2.dir 3.dir; do

touch -m -t 201003030303.03 /tmp/$Dir

done


練習4:寫一個腳本

使用for循環統計/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#開頭的行的行數;

#!/bin/bash


for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do

grep "^#" $File | wc -l

done


#!/bin/bash


for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do

LINES=`grep "^#" $File | wc -l`

echo "$File: $LINES"

done


#!/bin/bash


for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do

echo "$File: `grep "^#" $File | wc -l`"

done


練習5:寫一個腳本

使用for循環統計/etc/fstab、/etc/rc.d/rc.sysinit、/etc/inittab文件中各自以#開頭的行的行數和空白行數;

#!/bin/bash


for File in /etc/fstab /etc/rc.d/rc.sysinit /etc/inittab; do

echo "$File:"

echo -e "\t#lines: `grep "^#" $File | wc -l`"

echo -e "\tspace lines: `grep "^$" $File | wc -l`"

done


練習6:寫一個腳本

使用for循環分別將/proc/cpuinfo、/proc/meminfo、/proc/uptime三個文件中的所有小寫字符顯示爲大寫;

#!/bin/bash


for File in /proc/cpuinfo /proc/meminfo /proc/uptime; do

tr 'a-z' 'A-Z' < $File

done


練習7:寫一個腳本

使用for循環顯示用戶user1、user2和user3各自的id號;

#!/bin/bash


for I in 1 2 3; do

id -u user$I

done


#!/bin/bash


for I in 1 2 3; do

echo "user$I: `id -u user$I`"

done


練習8:寫一個腳本

使用for循環分別統計/usr、/var、/bin、/sbin目錄下各自的文件個數;

#!/bin/bash


for Dir in /usr /var /bin /sbin;do

ls $Dir | wc -l

done



練習9:寫一個腳本

使用for循環,分別將user1、user2和user3加入到testgrp組中,以其爲額外組;

#!/bin/bash

groupadd testgrp


for User in user1 user2 user3; do

usermod -a -G testgrp $User

done


練習10:寫一個腳本

使用for循環,將“Hello Linux.”,“Hello www.magedu.com”, “GNU is Not Unix.”三行內容添加至/tmp/test.txt文件;

添加完成後,顯示/tmp/test.txt文件的內容;

#!/bin/bash

for Line in "Hello Linux" "Hello www.magedu.com" "GNU is Not Unix"; do

echo $Line >> /tmp/test.txt

done


cat /tmp/test.txt


練習11:寫一個腳本

使用for循環,複製/etc/fstab、/etc/inittab和/etc/rc.d/init.d/functions文件至/tmp/目錄中,並重命名爲原有的名稱之後加當前日期,如第一個文件爲/tmp/fstab-2013-07-15;


#!/bin/bash

for File in /etc/fstab /etc/inittab /etc/rc.d/init.d/functions; do

cp $File /tmp/$File-`date +%F`

done


/etc/fstab /etc/inittab


#!/bin/bash

for File in fstab inittab; do

cp /etc/$File /tmp/$File-`date +%F`

done


練習12:寫一個腳本

顯示當前系統上所有默認shell爲/bin/bash的用戶名、ID號及其在/etc/passwd文件中的行號;


練習13:寫一個腳本

顯示/etc/passwd文件中第1、3、6、12個用戶的用戶名、ID和shell;


for Line in 1 3 6 12; do

UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`

Uid=`head -$Line /etc/passwd | tail -1 | cut -d: -f3`

Shell=`head -$Line /etc/passwd | tail -1 | cut -d: -f7`


echo "User: $UserName, UID is $Uid, Shell: $shell"

done


練習14:寫一個腳本

顯示/etc/passwd文件中第1、3、6、12個用戶的用戶名、ID和基本組的組名;

#!/bin/bash


for Line in 1 3 6 12; do

UserName=`head -$Line /etc/passwd | tail -1 | cut -d: -f1`

Uid=`head -$Line /etc/passwd | tail -1 | cut -d: -f3`

GroupName=`id -gn $UserName`

echo "$UserName, $Uid, $GroupName"

done


for 變量 in 列表; do

語句1

語句2

...

done


列表的生成:

1、逐個給出,如:/etc/inittab /etc/fstab;

2、使用通配符實現文件通配,例如for File in /var/*;

3、使用命令生成列表:見下面的例子


#!/bin/bash


for File in `ls /var`; do

file /var/$File

done


4、生成數字序列:

{}:{起始數字..結束數據},例如{1..100}表示從1到100之間的所有正整數;

`seq [起始數字] [步長] 結束數字`:


練習:寫一個腳本

使用for循環取出每個用戶用戶名和Shell;


#!/bin/bash

LINES=`wc -l /etc/passwd | cut -d' ' -f1`


for I in `seq 1 $LINES`; do

head -$I /etc/passwd | tail -1 | cut -d: -f1,7

done



如何在shell腳本中進行算術運算:

shell不支持浮點數;計算結果中的浮點數會被圓整爲整數;1.23, 1; 1.99=1;


+, -, *, /,


算術運算的實現方式:假設A=5,B=9

$[expression]:例如$[$A+$B]

$((expression)): 例如$(($A+$B))

let expression: 例如 let E=$A+$B

expr expression: F=`expr $A + $B`


練習:寫一個腳本,

隨意聲明兩個變量,並給出整數值,而後計算它們的加、減、乘、除;


練習:寫一個腳本

顯示/var/目錄下每個文件的內容類型,並統計文件的總數;


#!/bin/bash

#

Count=0


for File in /var/*; do

file $File

Count=$[$Count+1]

done


echo "Total files: $Count."


練習:寫一個腳本,計算100以內所有整數的和;


#!/bin/bash

#

Sum=0


for I in {1..100}; do

Sum=$[$Sum+$I]

done


echo "The sum is: $Sum."


練習:寫一個腳本,計算100以內,所有偶數的和,以及所有奇數的和;


#!/bin/bash


EvenSum=0

OddSum=0


for I in `seq 12 100`;do

OddSum=$[$OddSum+$I]

done


for I in `seq 22 100`;do

EvenSum=$[$EvenSum+$I]

done


echo "Even Sum:$EvenSum; Odd Sum: $OddSum."


練習:寫一個腳本,計算當前系統上所有用戶的ID號之和;

#!/bin/bash

IDSum=0


for I in `cut -d: -f3 /etc/passwd`; do

IDSum=$[$IDSum+$I]

done


echo "ID sum is: $IDSum."




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章