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."