bash脚本循环
① 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通过命令行来传递脚本中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脚本遍历目录指定后缀的文件,并执行操作
可以使用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吗?