當前位置:首頁 » 編程軟體 » bash腳本循環

bash腳本循環

發布時間: 2022-08-04 19:53:35

① bash腳本for循環報錯

1)把你的腳本修改如下:

$catx.sh
#!/bin/bash
foriin{1..4};
do
read-p"pleaseinputuseraccount:"username
stty-echo
read-p"pleaseinputpassword:"password
sttyecho
echo-e\n
if["$username"=="summit"]&&["$password"=="hisummit"];then
echo"correctuser,correctpassword,welcome!"
break
else
echo"wronguser,or/andwrongpassword,pleasetryagain."
fi
done

if[$i-eq4];then
exececho"wronguser/password,bye-bye"
fi

echo"Welcometousethislinuxmachine"
echo"......"
......腳本中後面的命令可以繼續運行


2)執行腳本,輸入正確的用戶名和密碼:

$x.sh(或者執行./x.sh)
pleaseinputuseraccount:summit
pleaseinputpassword:

correctuser,correctpassword,welcome!
WelcometousethisLinuxmachine
......
......腳本中後面的命令可以繼續運行

腳本中for循環後面的命令可以繼續運行。


3)執行腳本,連續4次輸入錯誤的用戶名和密碼(要麼都錯,要麼用戶名和密碼其中錯一個):

$x.sh(或者執行./x.sh)
pleaseinputuseraccount:abcd
pleaseinputpassword:

wronguser,or/andwrongpassword,pleasetryagain.
pleaseinputuseraccount:summiitt
pleaseinputpassword:

wronguser,or/andwrongpassword,pleasetryagain.
pleaseinputuseraccount:peter
pleaseinputpassword:

wronguser,or/andwrongpassword,pleasetryagain.
pleaseinputuseraccount:summitt
pleaseinputpassword:

wronguser,or/andwrongpassword,pleasetryagain.
wronguser/password,bye-bye(這里就bye-bye了,for循環後面的命令不能執行了)

列印出wrong user/password, bye-bye之後,腳本結束了,for循環後面的命令不能執行了。


供參考,謝謝!

② 如何用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 file in *,通配符*產生文件名擴展,匹配當前目錄下的所有文件。

  • for通過命令行來傳遞腳本中for循環列表參數

  • #!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argument in "$@"doecho "$argument"done


  • $#表示參數的個數,$@表示參數列表而$*則把所有的參數當作一個字元串顯示。

    (3)不帶列表for循環

    由用戶制定參數和參數的個數,與上述的for循環列表參數功能相同。

  • #!/bin/bashecho "number of arguments is $#"echo "What you input is: "for argumentdoecho "$argument"done

  • 比上述代碼少了$@參數列表,$*參數字元串。
  • (4)類C風格的for循環

    也被稱為計次循環

  • #!/bin/bashfor((integer = 1; integer <= 5; integer++))do echo "$integer"done

  • for中第一個表達式(integer = 1)是循環變數賦初值的語句,第二個表達式(integer <= 5)決定是否進行循環的表達式,退出狀態為非0時將退出for循環執行done後的命令(與C中的for循環條件是剛好相反的)。第三個表達式(integer++)用於改變循環變數的語句。

    Sheel中不運行使用非整數類型的數作為循環變數,循環條件被忽略則默認的退出狀態是0,for((;;))為死循環。

    類C的for循環計算1~100內所有的奇數之和。

  • #!/bin/bashsum=0for(( i = 1; i <= 100; i = i + 2 ))dolet "sum += i"doneecho "sum=$sum"

  • 2、while循環

    也稱為前測試循環語句,重復次數是利用一個條件來控制是否繼續重復執行這個語句。為了避免死循環,必須保證循環體中包含循環出口條件即表達式存在退出狀態為非0的情況。

    (1)計數器控制的while循環

  • #!/bin/bashsum=0i=1while(( i <= 100 ))dolet "sum+=i"let "i += 2" doneecho "sum=$sum"

  • 指定了循環的次數500,初始化計數器值為1,不斷測試循環條件i是否小於等於100。在循環條件中設置了計數器加2來計算1~100內所有的奇數之和。

  • (2)結束標記控制的while循環

    設置一個特殊的數據值(結束標記)來結束while循環。

  • #!/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

  • 標志控制的while循環求1~n的累加和,循環變數值小於100執行else累加同時循環變數加1,直到循環變數值等於100將標志值設置為1,並輸出。

    標志控制的while循環與結束標記控制的while循環的區別是用戶無法確定無法確定結束標志,只能程序運行後確定結束標志。兩者也可以相互轉化。

    (4)命令行控制的while循環
    使用命令行來指定輸出參數和參數個數,通常與shift結合使用,shift命令使位置變數下移一位($2代替$1、$3代替$2,並使$#變數遞減),當最後一個參數顯示給用戶,$#會等於0,$*也等於空。

  • #!/bin/bashecho "number of arguments is $#"echo "What you input is: "while [[ "$*" != "" ]]doecho "$1"shiftdone


  • 循環條件可以改寫為while[[ "$#" -ne 0 ]],等於0時退出while循環
  • 3、until循環

    until命令和while命令類似,while能實現的腳本until同樣也可以實現,但區別是until循環的退出狀態是不為0,退出狀態是為0(與while剛好相反),即whie循環在條件為真時繼續執行循環而until則在條件為假時執行循環。

  • #!/bin/bashi=0until [[ "$i" -gt 5 ]] #大於5dolet "square=i*i"echo "$i * $i = $square"let "i++"done


  • 4、循環嵌套

    一個循環體內又包含另一個完整的循環結構,在外部循環的每次執行過程中都會觸發內部循環,for、while、until可以相互嵌套。

    (1)嵌套循環實現九九乘法表

  • #!/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

  • (2)for循環嵌套實現*圖案排列

  • #!/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


  • 外層for循環嵌套了兩個內層while循環,先列印空格在列印*號形成圖案。

    5、循環控制符break和continue

    若須退出循環可使用break循環控制符,若退出本次循環執行後繼續循環可使用continue循環控制符。

    (1)break

    在for、while和until循環中break可強行退出循環,break語句僅能退出當前的循環,如果是兩層循環嵌套,則需要在外層循環中使用break。

  • #!/bin/bashsum=0for (( i=1; i <= 100; i++))do let "sum+=i"if [ "$sum" -gt 1000 ]thenecho "1+2+...+$i=$sum"breakfidone

  • (2)continue

    在for、while和until中用於讓腳本跳過其後面的語句,執行下一次循環。continue用於顯示100內能被7整除的數。

  • #!/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

  • 6、select結構

    select結構從技術角度看不能算是循環結構,只是相似而已,它是bash的擴展結構用於互動式菜單顯示,功能類似於case結構比case的交互性要好。

    (1)select帶參數列表

  • #!/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"


  • 三、總結

    (1)循環結構中相互嵌套組成更復雜的流程,並結合break和continue可以實現很多復雜的運算。

    (2)可以結合其他語言的語法有助於更好的理解循環結構。

    (3)熟練應用還需要大量的重復練習,重寫優秀的shell代碼也是一種很好的方式。

③ bash腳本遍歷目錄指定後綴的文件,並執行操作

可以使用ls或者find來完成對某個文件夾下所有文件的遍歷
比如使用ls
可以簡單地使用一個通配符來完成
ls 某個目錄/*
也可以使用find來完成
比如
find 某個目錄
自然的也可以寫一個shell腳本來進行遍歷
首先進行一個要遍歷的文件夾
然後循環查看每個文件
如果該文件是一個文件夾的話則進入該文件夾做和上面相同的事件
這樣就可以該整個文件夾內的所有文件進行遍歷了
一個簡單的代碼如下
#!/bin/bash

function show()
{
cd $1

for i in `ls`
do
if [ -d "$i" ]
then
show "$i"
else
echo "$i"
fi
done

cd ..
}

show $1

exit 0
該程序不能遍歷以.開頭的隱藏文件
可以使用ls -a來進行遍歷隱藏文件
遍歷時需要注意.和..這兩個特殊文件

下面是一個簡單的代碼
#!/bin/bash

function show()
{
cd $1

for i in `ls -a`
do
if [ "$i" == "." ] || [ "$i" == ".." ]
then
continue;
fi

if [ -d "$i" ]
then
show "$i"
else
echo "$i"
fi
done

cd ..
}

show $1

exit 0

④ 怎麼用shell腳本循環遍歷一個文件的每一條命令

命令一行一行排好,直接bash 那個文件就ok.就一個套娃

⑤ Shell腳本 根據文件夾下所有文件進行循環

這個任務 可以通過 find ./ 簡單的解決,不需要遞歸循環啊。

⑥ 關於linux的shell腳本,無限循環問題

10毫秒起一個java,1秒就起來100個java,
10秒就啟動了1000個java

⑦ 使用bash腳本,使用for循環和arg參數編寫一個實現將命令行的多個參數逆序輸出的程序

腳本自己寫了一個,可能不完全符合條件2要求(cmd變數沒用上),但是逆序列印詞串大概沒問題,你自己試下:
#!/bin/bash
count=$#
for arg in $*
do
echo -n "${count} "
let "count=count-1"
done
第一個問題的答案:vi,或者你寫vim也對,一般vi是vim的鏈接,運行命令行下的vi編輯器。
第二個問題沒看明白要cmd這個變數啥用,可能是我愚鈍,我不知道怎樣重定向一個字元串追加到一個變數的末尾,想了個變通的方法。
第三個問題的答案:chmod 0750 /<到腳本位置的絕對路徑>/<腳本文件名>
第四個問題的答案:你把這串字元按照空格隔開為一個單元的規律倒序寫即可,就是這樣ddff gdd ddd ac ab aa

⑧ Shell腳本如何控制外循環一次內循環一次,請教高手!!!

雖然覺得不適合用循環嵌套來實現,但畢竟還是可以做到的。

用計數器來同步內外循環即可。

#!/bin/bash
unseta
unsetc
count1=0
forain000210220451240
do
letcount1+=1
count2=0
forcin001002003004005
do
letcount2+=1
[$count2-eq$count1]&&echo$c&&break
done
echo$a
done

⑨ 編寫一個bash腳本程序,用for循環實現將當前目錄所有的·c文件移到指定的目錄

#!/bin/bash

for i in `ls *.c`
do
cp $i /path
done

順便提一下,直接用
cp *.c /path/ 一樣可以把.c文件拷到指定目錄,for循環並不是必要的

⑩ bash腳本中循環觸發和控制都是變數時

command2會改變$A,既然執行完command2後$A的值並沒有使用,為什麼要保留command2中對$A的改變,
if [ -n $A ]; then

(
command2
)
在圓括弧中的命令對$A的改變不改變括弧外的$A
為什麼 在command2中非要用A ,不能將A賦值給B,改變B嗎?

熱點內容
tomcat上傳超時 發布:2025-02-09 01:41:42 瀏覽:483
androidactivity豎屏 發布:2025-02-09 01:41:40 瀏覽:377
家庭配置怎麼合理 發布:2025-02-09 01:36:14 瀏覽:807
頭條軍事源碼 發布:2025-02-09 01:31:53 瀏覽:997
androidintent視頻 發布:2025-02-09 01:31:43 瀏覽:858
歐姆龍plc密碼如何設置 發布:2025-02-09 01:24:31 瀏覽:687
php支持jpeg 發布:2025-02-09 01:24:22 瀏覽:803
反編譯去注冊碼 發布:2025-02-09 01:19:48 瀏覽:887
安卓如何查找舊密碼 發布:2025-02-09 01:17:21 瀏覽:418
hadoop雲存儲 發布:2025-02-09 01:02:49 瀏覽:453