当前位置:首页 » 编程软件 » 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吗?

热点内容
生命密码解读走什么 发布:2025-02-09 04:55:51 浏览:279
python常用正则表达式 发布:2025-02-09 04:42:53 浏览:178
机器人编程培训哪家好 发布:2025-02-09 04:37:44 浏览:308
上海怎么学习java 发布:2025-02-09 04:26:39 浏览:23
erp系统搭建备用服务器 发布:2025-02-09 04:07:38 浏览:946
戴尔服务器在bios怎么配置管理ip 发布:2025-02-09 04:01:53 浏览:551
小鱼易连云存储 发布:2025-02-09 03:59:47 浏览:92
正在限制访问 发布:2025-02-09 03:47:17 浏览:904
架设数据库 发布:2025-02-09 03:41:29 浏览:966
imacpro哪个配置最好 发布:2025-02-09 03:32:29 浏览:253