bash腳本while
『壹』 求解答關於linux中shell的while腳本用法
#!/bin/sh
num=1
while [ $num -le 10 ]
do
SUM =' expr $num \* $num ' #SUM等號之間不能有空格 ,等號後面語句單引號換成反引號
echo $SUM
num =" expr $num +1 " #這一行雙引號換反引號 ,1與+號之間有空格。
done
shell的語法檢查是比較嚴格的,尤其是空格以後多注意
『貳』 如何用bash腳本中創建while無限循環
一、簡介
Shell編程中循環命令用於特定條件下決定某些語句重復執行的控制方式,有三種常用的循環語句:for、while和until。while循環和for循環屬於「當型循環」,而until屬於「直到型循環」。循環控制符:break和continue控制流程轉向。
二、詳解
1、for循環
(1)for循環有三種結構:一種是列表for循環,第二種是不帶列表for循環。第三種是類C風格的for循環。
(2)列表for循環
#!/bin/bashfor varible1 in {1..5}#for varible1 in 1 2 3 4 5doecho "Hello, Welcome $varible1 times "done
do和done之間的命令稱為循環體,執行次數和list列表中常數或字元串的個數相同。for循環,首先將in後list列表的第一個常數或字元串賦值給循環變數,然後執行循環體,以此執行list,最後執行done命令後的命令序列。
Sheel支持列表for循環使用略寫的計數方式,1~5的范圍用{1..5}表示(大括弧不能去掉,否則會當作一個字元串處理)。
Sheel中還支持按規定的步數進行跳躍的方式實現列表for循環,例如計算1~100內所有的奇數之和。
- #!/bin/bashsum=0for i in {1..100..2}dolet "sum+=i"doneecho "sum=$sum"
- 通過i的按步數2不斷遞增,計算sum值為2500。同樣可以使用seq命令實現按2遞增來計算1~100內的所有奇數之和,for i in $(seq 1 2 100),seq表示起始數為1,跳躍的步數為2,結束條件值為100。
for循環對字元串進行操作,例如通過for循環顯示當前目錄下所有的文件。
- #!/bin/bashfor file in $( ls )#for file in *doecho "file: $file"done
for通過命令行來傳遞腳本中for循環列表參數
- #!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argument in "$@"doecho "$argument"done
- #!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argumentdoecho "$argument"done
- 比上述代碼少了$@參數列表,$*參數字元串。
- #!/bin/bashfor((integer = 1; integer <= 5; integer++))do echo "$integer"done
- #!/bin/bashsum=0for(( i = 1; i <= 100; i = i + 2 ))dolet "sum += i"doneecho "sum=$sum"
- #!/bin/bashsum=0i=1while(( i <= 100 ))dolet "sum+=i"let "i += 2" doneecho "sum=$sum"
- 指定了循環的次數500,初始化計數器值為1,不斷測試循環條件i是否小於等於100。在循環條件中設置了計數器加2來計算1~100內所有的奇數之和。
- #!/bin/bashecho "Please input the num(1-10) "read numwhile [[ "$num" != 4 ]]do if [ "$num" -lt 4 ]thenecho "Too small. Try again!"read numelif [ "$num" -gt 4 ]thenecho "To high. Try again" read numelseexit 0fidoneecho "Congratulation, you are right! "
- #!/bin/bashecho "Please input the num "read numfactorial=1while [ "$num" -gt 0 ]dolet "factorial= factorial*num"let "num--"doneecho "The factorial is $factorial"
- (3)標志控制的while循環
- #!/bin/bashecho "Please input the num "read numsum=0i=1signal=0while [[ "$signal" -ne 1 ]]doif [ "$i" -eq "$num" ]thenlet "signal=1"let "sum+=i"echo "1+2+...+$num=$sum"elselet "sum=sum+i"let "i++"fidone
- #!/bin/bashecho "number of arguments is $#"echo "What you input is: "while [[ "$*" != "" ]]doecho "$1"shiftdone
- 循環條件可以改寫為while[[ "$#" -ne 0 ]],等於0時退出while循環
- #!/bin/bashi=0until [[ "$i" -gt 5 ]] #大於5dolet "square=i*i"echo "$i * $i = $square"let "i++"done
- #!/bin/bashfor (( i = 1; i <=9; i++ ))dofor (( j=1; j <= i; j++ ))dolet "temp = i * j" echo -n "$i*$j=$temp " done echo "" #output newlinedone
- #!/bin/bashfor ((i=1; i <= 9; i++))doj=9;while ((j > i))doecho -n " "let "j--"donek=1while ((k <= i))doecho -n "*"let "k++"doneecho ""done
- #!/bin/bashsum=0for (( i=1; i <= 100; i++))do let "sum+=i"if [ "$sum" -gt 1000 ]thenecho "1+2+...+$i=$sum"breakfidone
- #!/bin/bashm=1for (( i=1; i < 100; i++ ))dolet "temp1=i%7" #被7整除if [ "$temp1" -ne 0 ]thencontinuefiecho -n "$i "let "temp2=m%7" #7個數字換一行if [ "$temp2" -eq 0 ]thenecho ""filet "m++"done
- #!/bin/bashecho "What is your favourite color? "select color in "red" "blue" "green" "white" "black"do breakdoneecho "You have selected $color"
- (2)select不帶參數列表
- #!/bin/bashecho "What is your favourite color? "select colordo breakdoneecho "You have selected $color"
也可一使用for file in *,通配符*產生文件名擴展,匹配當前目錄下的所有文件。
$#表示參數的個數,$@表示參數列表而$*則把所有的參數當作一個字元串顯示。
(3)不帶列表for循環
由用戶制定參數和參數的個數,與上述的for循環列表參數功能相同。
(4)類C風格的for循環
也被稱為計次循環
for中第一個表達式(integer = 1)是循環變數賦初值的語句,第二個表達式(integer <= 5)決定是否進行循環的表達式,退出狀態為非0時將退出for循環執行done後的命令(與C中的for循環條件是剛好相反的)。第三個表達式(integer++)用於改變循環變數的語句。
Sheel中不運行使用非整數類型的數作為循環變數,循環條件被忽略則默認的退出狀態是0,for((;;))為死循環。
類C的for循環計算1~100內所有的奇數之和。
2、while循環
也稱為前測試循環語句,重復次數是利用一個條件來控制是否繼續重復執行這個語句。為了避免死循環,必須保證循環體中包含循環出口條件即表達式存在退出狀態為非0的情況。
(1)計數器控制的while循環
(2)結束標記控制的while循環
設置一個特殊的數據值(結束標記)來結束while循環。
例:通過結束標記控制實現階乘的操作
使用用戶輸入的標志值來控制循環的結束(避免不知道循環結束標志的條件)。
標志控制的while循環求1~n的累加和,循環變數值小於100執行else累加同時循環變數加1,直到循環變數值等於100將標志值設置為1,並輸出。
標志控制的while循環與結束標記控制的while循環的區別是用戶無法確定無法確定結束標志,只能程序運行後確定結束標志。兩者也可以相互轉化。
(4)命令行控制的while循環
使用命令行來指定輸出參數和參數個數,通常與shift結合使用,shift命令使位置變數下移一位($2代替$1、$3代替$2,並使$#變數遞減),當最後一個參數顯示給用戶,$#會等於0,$*也等於空。
3、until循環
until命令和while命令類似,while能實現的腳本until同樣也可以實現,但區別是until循環的退出狀態是不為0,退出狀態是為0(與while剛好相反),即whie循環在條件為真時繼續執行循環而until則在條件為假時執行循環。
4、循環嵌套
一個循環體內又包含另一個完整的循環結構,在外部循環的每次執行過程中都會觸發內部循環,for、while、until可以相互嵌套。
(1)嵌套循環實現九九乘法表
(2)for循環嵌套實現*圖案排列
外層for循環嵌套了兩個內層while循環,先列印空格在列印*號形成圖案。
5、循環控制符break和continue
若須退出循環可使用break循環控制符,若退出本次循環執行後繼續循環可使用continue循環控制符。
(1)break
在for、while和until循環中break可強行退出循環,break語句僅能退出當前的循環,如果是兩層循環嵌套,則需要在外層循環中使用break。
(2)continue
在for、while和until中用於讓腳本跳過其後面的語句,執行下一次循環。continue用於顯示100內能被7整除的數。
6、select結構
select結構從技術角度看不能算是循環結構,只是相似而已,它是bash的擴展結構用於互動式菜單顯示,功能類似於case結構比case的交互性要好。
(1)select帶參數列表
該結構通過命令行來傳遞參數列表,由用戶自己設定參數列表。
三、總結
(1)循環結構中相互嵌套組成更復雜的流程,並結合break和continue可以實現很多復雜的運算。
(2)可以結合其他語言的語法有助於更好的理解循環結構。
(3)熟練應用還需要大量的重復練習,重寫優秀的shell代碼也是一種很好的方式。
『叄』 Bash腳本,自動遞增序列的問題。
2>/dev/null 是將錯誤輸出重定向到文件/dev/null,/dev/null是由系統維護的一個垃圾站並且自動清空,你可以用cat工具看看,裡面是空的。如果你刪了這句,錯誤輸出將顯示到屏幕。2是一個文件描述符,代表標准錯誤輸出文件,默認為屏幕即/dev/stdout,另外0代表標准輸入,1代表標准輸出。學Shell推薦你看sobell的「Linux命令、編輯器與shell編程」,不要被一些爛書誤導了。
『肆』 這個shell腳本中的while用法有什麼錯誤么
兩個錯誤
第5行的SUM =中間不要空格
echo SUM需要寫成echo $SUM
『伍』 shell編程中while ture和while :為什麼等同
先保證你的linux命令行窗口是bash環境,我來給你細講。
1)運行bash,確保是bash環境
2)下面看看相關命令的幫助。
運行 help true,你會看到:
$ help true
true: true
Return a successful result.
Exit Status:
Always succeeds.
true是bash的內置命令,總返回成功(退出狀態總是0)。
3)運行 help : ,你會看到:
$ help :
:: :
Null command.
No effect; the command does nothing.
Exit Status:
Always succeeds.
冒號 : 是bash的內置命令,也叫空命令,也叫null命令,總返回成功(退出狀態總是0)。
4)運行 help while ,你會看到:
$ help while
while: while COMMANDS; do COMMANDS; done
Execute commands as long as a test succeeds.
Expand and execute COMMANDS as long as the final command in the
`while' COMMANDS has an exit status of zero.
Exit Status:
Returns the status of the last command executed.
while 是bash的內置命令,while後面的命令成功(退出狀態是0)時,do 和done之間的命令就會執行,即,do 和done之間的東西就會循環。
所以說 while true與while :確實等同。類似於C語言中的 while (1),用於構造無窮循環。
『陸』 寫一個UNIX的bash 腳本,要求如下
其實一條命令就搞定。
#!/bin/bash
ls -l | awk 'NR>1{if((substr($0,0,1)=="-") && ($1!~"x"))num+=1}END{printf("Found %d text files.\nFound %d files of other types.\n", num, NR-1-num)}'
解釋一下:
使用時將腳本放在你要統計的目錄下。或者你可以自己簡單改一下腳本從命令行參數讀入目錄路徑。
ls -l 出來的結果,第一行是統計數據,所以awk要從第二行開始處理(即NR>1)
用awk內置函數substr取出每行數據的第一個字元,為"-"則說明是普通文件
再對每行判斷第一個欄位(文件屬性)中是否包含x,包含x的為可執行文件,不包含的為文本文件。
awk處理完後最後格式化列印(END語句塊)。
-------------------------------------------------------
另外一種方法:
#!/bin/bash
count=0
num=0
tmpfile=/tmp/temp
ls -l >$tmpfile
while read line
do
let count+=1
[ $count -eq 1 ] && continue
if [ ${line:0:1} = "-" ]; then
flag=`echo $line|awk '{print match($1,"x")}'`
[ $flag -eq 0 ] && let num+=1
fi
done <$tmpfile
rm -f $tmpfile
echo "Found $num text files."
echo "Found $((count-num)) files of other types."
注意:臨時文件tmpfile不能存放在ls當前目錄下,否則統計出來會多出一個文本文件的。
使用時將腳本放在你要統計的目錄下。或者你可以自己簡單改一下腳本從命令行參數讀入目錄路徑。
『柒』 linux下怎麼運行bash腳本
linux下運行bash腳本的方法如下:
1.
首先在桌面右鍵點擊,選擇在終端中打開,打開命令行;
2.
在命令行中輸入
cd
腳本路徑,進入腳本所在目錄;
3.
使用chmod
+x
腳本名命令給文件添加可執行許可權;
4.
使用sh
腳本名或者
./腳本名的方法來運行bash腳本。
『捌』 ubuntu下shell腳本編程無法使用while...
把 while 及 [ 保持空格
#! /bin/bash
var=1
end=10
while [ $var -ne $end ]
do
[do something....skipped]
(( var++ ))
done
『玖』 shell while語句 判斷文件是否存在 我要讓我的腳本等待某一文件夾自動生
# 這里的-x 參數判斷$myPath是否存在並且是否具有可執行許可權
8. if [ ! -x "$myPath"]; then
9. mkdir "$myPath"
10. fi
11.
12. # 這里的-d 參數判斷$myPath是否存在
13. if [ ! -d "$myPath"]; then
14. mkdir "$myPath"
15. fi
16.
17. # 這里的-f參數判斷$myFile是否存在
18. if [ ! -f "$myFile" ]; then
19. touch "$myFile"
20. fi
希望幫到你。
===========================================
我暈 樓上答得這快~!!!!!