『壹』 shell里的for循環怎麼寫
for循環的運作方式,是講串列的元素意義取出,依序放入指定的變數中,然後重復執行含括的命令區域(在do和done 之間),直到所有元素取盡為止。
其中,串列是一些字元串的組合,彼此用$IFS所定義的分隔符(如空格符)隔開,這些字元串稱為欄位。
for的語法結構如下:
1
2
3
4
for 變數 in 串列
do
執行命令
done
說明:
行1,講串列中的欄位迭代放入變數中
行2-4,接著將重復執行do和done之間的命令區域,直到串列中每一個欄位軍處理過為止。
流程圖:
用例1
用for循環在家目錄下創建aaa1-aaa10,然後在aaa1-aaa10創建bbb1-bbb10的目錄
1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
for k in $( seq 1 10 )
do
mkdir /home/kuangl/aaa${k}
cd /home/kuangl/aaa${k}
for l in $( seq 1 10 )
do
mkdir bbb${l}
cd /home/kuangl/aaa${k}
done
cd ..
done
說明:
行2,seq 用於產生從某個數到另外一個數之間的所有整數。
行4,在家目錄下創建文件夾。
行6,在使用一個for循環創建文件夾
測試結果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@test01 kuangl]# ll
total 80
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa1
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa10
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa2
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa3
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa4
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa5
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa6
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa7
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa8
drwxr-xr-x 12 root root 4096 Jul 20 01:23 aaa9
[root@test01 kuangl]# cd aaa1
[root@test01 aaa1]# ll
total 40
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb1
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb10
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb2
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb3
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb4
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb5
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb6
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb7
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb8
drwxr-xr-x 2 root root 4096 Jul 20 01:23 bbb9
1
用例2
列出var目錄下各子目錄佔用磁碟空間的大小。
1
2
3
4
5
6
7
#!/bin/bash
DIR="/var"
cd $DIR
for k in $(ls $DIR)
do
[ -d $k ] && -sh $k
done
說明:
行4,對/var目錄中每一個文件,進行for循環處理。
行6,如果/var下的文件是目錄,則使用 -sh計算該目錄佔用磁碟空間的大小。
測試結果:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@test01 scripts]# ./var.sh
276M cache
4.0K cvs
84K db
8.0K empty
4.0K ftp
4.0K games
4.0K gdm
21G lib
4.0K local
16K lock
7.4G log
4.0K logs
0 mail
4.0K nis
4.0K opt
4.0K preserve
336K run
3.7G spool
212K tmp
4.1G www
4.0K yp
『貳』 shell語法檢查模式詳解
啟用 verbose 調試模式
在進入本指導的重點之前,讓我們簡要地探索下verbose 模式。它可以用 -v 調試選項來啟用,它會告訴 shell 在讀取時顯示每行。要展示這個如何工作,下面是一個示例腳本來批量將 PNG 圖片轉換成 JPG 格式。
將下面內容輸入(或者復制粘貼)到一個文件中。
#!/bin/bash
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
done
exit 0
接著保存文件,並用下面的命令使腳本可執行:
$ chmod +x script.sh
我們可以執行腳本並顯示它被 Shell 讀取到的每一行:
$ bash -v script.sh
在 Shell 腳本中啟用語法檢查調試模式
使用 -n 激活語法檢查模式
它會讓 shell 讀取所有的命令,但是不會執行它們,它(shell)只會檢查語法。一旦 shell 腳本中發現有錯誤,shell 會在終端中輸出錯誤,不然就不會顯示任何東西。
激活語法檢查的命令如下:
$ bash -n script.sh
因為腳本中的語法是正確的,上面的命令不會顯示任何東西。所以,讓我們嘗試刪除結束 for 循環的 done 來看下是否會顯示錯誤:
下面是修改過的含有 bug 的批量將 png 圖片轉換成 jpg 格式的腳本。
#!/bin/bash
#script with a bug
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
保存文件,接著運行該腳本並執行語法檢查:
$ bash -n script.sh
從上面的輸出中,我們看到我們的腳本中有一個錯誤,for 循環缺少了一個結束的 done 關鍵字。shell 腳本從頭到尾檢查文件,一旦沒有找到它(done),shell 會列印出一個語法錯誤:
script.sh: line 11: syntax error: unexpected end of file
我們可以同時結合 verbose 模式和語法檢查模式:
$ bash -vn script.sh
我們還可以通過修改腳本的首行來啟用腳本檢查
如下面的例子:
#!/bin/bash -n
#altering the first line of a script to enable syntax checking
#convert
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
exit 0
如上所示,保存文件並在運行中檢查語法:
$ ./script.sh
script.sh: line 12: syntax error: unexpected end of file
此外,我們可以用內置的 set 命令來在腳本中啟用調試模式。
下面的例子中,我們只檢查腳本中的 for 循環語法。
#!/bin/bash
#using set shell built-in command to enable debugging
#convert
#enable debugging
set -n
for image in *.png; do
convert "$image" "${image%.png}.jpg"
echo "image $image converted to ${image%.png}.jpg"
#disable debugging
set +n
exit 0
再一次保存並執行腳本:
$ ./script.sh
總的來說,我們應該保證在執行 Shell 腳本之前先檢查腳本語法以捕捉錯誤。
『叄』 shell中done後跟 < 一個重定向是什麼意思 done < /root/waa/userinfo.dat
while read line
do
…
done < file
read通過輸入重定向,把file的第一行所有的內容賦值給變數line,循環體內的命令一般包含對變數line的處理;然後循環處理file的第二行、第三行。。。一直到file的最後一行。還記得whilewhile條件循環語句根據其後的命令退出狀態來判斷是否執行循環體嗎?是的,read命令也有退出狀態,當它從文件file中讀到內容時,退出狀態為0,循環繼續驚醒;當read從文件中讀完最後一行後,下次便沒有內容可讀了,此時read的退出狀態為非0,所以循環才會退出。
『肆』 在linux中 「# for i in `ls` ; do su -sh $i ; done 」命令是什麼意思
首先 在命令前面有個 '#'的意思是本句話是注釋彎圓蘆,並不實際執行...
再說你後面語句的意思,for ... in .... ; done是循環結構,ls是查看目錄下的文件,su是以另一個身份($i),來運行一個shell,但問題是su 沒有-sh選項,也就是說你這句話應該有問題才對.
整體分析是遍歷將當前腔賣目錄下的文件,每個文件執行su -sh XXX(這里XXX是當前目錄下的所有文件埋帶),功能尚不明確,還請樓主明示.
#!/bin/sh # 指定解釋器
#
#Filename: square.sh # 文件名
int=1 # 定義變數int並初始化為1
#功能:輸出1~5的平方
while [ $int -le 5 ] # int小於5時循環
do
sq=`expr $int \* $int` # 計算int * int
echo $sq # 輸出計算結果
int=`expr $int + 1` # 循環變數加1
done
echo "Job completed" # 輸出結束信息
$ sh square.sh # 執行腳本 square.sh
1 # 輸出結果
4
9
16
25
Job completed
『陸』 linux shell腳本讀取用戶輸入的參數
$# 是傳給腳本的參數個數
$0 是腳本本身的名字
$1是傳遞給該shell腳本專的第一個參屬數
$2是傳遞給該shell腳本的第二個參數
$@ 是傳給腳本的所有參數的列表
例如:
#!/bin/sh
echo "arg_num: $#"
echo "shell_name: $0"
echo "first_arg : $1"
echo "second_arg : $2"
echo "args : $@"