一个简单的shell脚本问题!怎么出现了死循环呢?谢谢

来自:    更新日期:早些时候
不知道shell程序为什么会陷入死循环中?~

上面说的有点抽象,我给你举个例子:
# echo "0.2 <= 1.0" | bc -l
1
# echo $?
0
# echo "1.2 <= 1.0" | bc -l
0
# echo $?
0
# [ $(echo "1.2 <= 1.0" | bc -l) ]
# echo $?
0
# [ $(echo "0.2 <= 1.0" | bc -l) ]
# echo $?
0
你可能被以前学的c或其他语言误导了,
[] 在这里的作用其实跟()在c语言中的作用是完全不一样的,
[ $(echo "1.2 <= 1.0" | bc -l) ] 等价于 test $(echo "1.2 <= 1.0" | bc -l)
他其实是个shell命令,给while的判定条件并不是中空号里面的语句,而是包括括号在内的整体所返回的楼上所说的退出状态。并且,shell你面的true/false跟c语言里面正好相反,返回0表示true,返回值大于0表示false。所以你那个语句要写成:while [ $(echo "$i <= 1.0" | bc -l)!=0 ]

使用死循环消耗CPU资源。
本脚本,如果是有多颗CPU,可以选择消耗多少颗CPU的资源;使用方法很简单,参数8表示消耗8颗CPU的资源,运行后,会有一堆 kill 命令,运行这些命令即可kill掉死循环进程。

#! /bin/bash
# filename killcpu.sh
endless_loop()
{
echo -ne "i=0;
while true
do
i=i+100;
i=100
done" | /bin/bash &
}

if [ $# != 1 ] ; then
echo "USAGE: $0 "
exit 1;
fi
for i in `seq $1`
do
endless_loop
pid_array[$i]=$! ;
done

for i in "${pid_array[@]}"; do
echo 'kill ' $i ';';
done
运行命令:./killcpu.sh 8
输出:kill 20926 ;
kill 20928 ;
kill 20930 ;
kill 20932 ;
kill 20934 ;
kill 20936 ;
kill 20938 ;
kill 20940 ;

用top看资源消耗。

这里改一下:
q)
echo "quit"
a=11 或直接用 break
;;
Q)
echo "quit"
a=11 或直接用 break
;;

另外,可以这样写,表示同时匹配两个字母:
qQ) xxx ;;

while [ "$a" = "1" ]
...

a=11这样才是正确的赋值,而不是$a -eq 11...

我输入2怎么没反应啊?且我输入其他字符,如“a“,怎么不弹出"Isn't your list"
啊??高手求解!谢谢
有,你的 clear 把它给清了呗。
加上一个按任意键继续的判断就可以看到效果了。下面是根据你的脚本改的语句,当然这样的东西用 select 来做可能更方便,你可以自己看教程。

#!/bin/bash
declare a="1"
while [ "$a" -eq "1" ]
do
clear
echo ""
echo "the number book"
echo ""
echo "1.add a new book list"
echo ""
echo "2.display a new book list"
echo ""
echo "q quit"
echo "enter your choose:"
read intput
case $intput in
1)
echo "please you add a new book list to list.txt"
read intput2
echo $intput2>>list.txt
continue
;;
2)
echo "display a new book list"
cat list.txt
;;
q)
echo "quit"
break
;;
Q)
echo "quit"
break
;;
*)
echo "Isn't your list"
esac

read -s -n1 -p "Press any key to continue..."

done


一个简单的shell脚本问题!怎么出现了死循环呢?谢谢视频

相关评论:
  • 19314193360LINUX的shell脚本功能问题
    杭玉邰count=$# # 获取脚本参数个数 cmd=echo # 初始化 cmd 变量,赋值为 “echo”while [ $count -gt 0] # 如果 count 大于0,执行下面的循环 do cmd="$cmd \\$$count" # 给cmd重新赋值,变为 “echo ${count的值}”count='expr $count-1' # count减1 done # 之后回到上...

  • 19314193360Linux 我写了一个简单的脚本aaa.sh,内容没有问题,权限也都有,我用...
    杭玉邰你的脚本写的格式有问题的。建议这样:! \/bin\/sh echo "---"exit 这样写出来的脚本是不会遇到你上面的问题了。第一行的“#! \/bin\/sh”不要少。有了这行定义,系统就知道你写的是一个shell脚本,另外你的脚本缺少可执行权限,需要使用chmod +x aaa.sh命令将可执行权限添加上去,这样,就可以...

  • 19314193360编shell脚本遇到一个问题,awk能切割掉最后一个字段的值嘛?
    杭玉邰先设个变量:path=\/usr\/share\/man\/man5\/locale.alias.5.gz 法一,bash中特有的字符串分割法:echo ${path%\/*}\/ 法二,sed中的s替换命令,利用了*在正则中的贪婪特性:echo $path | sed 's#\\(.*\/\\).*#\\1#'法三,awk字段分割重组:echo $path | awk -F\/ '{for(i=1;i<NF;i++...

  • 19314193360linux shell脚本问题
    杭玉邰它在当前Shell中启动一个子Shell来运行脚本程序。2.“.” jiaoben.sh这种方式是在当前Shell中执行脚本程序,同样“.”是一个命令,文件名是它的参数,不需要可执行属性。3.直接通过文件名执行脚本程序,这时需要设置可执行属性,.\/jiaoben.sh就表示在当前目录执行jiaoben.sh 希望能帮助你。。。

  • 19314193360小弟刚学linux系统shell脚本没几天,下面有一个题目,麻烦大叫帮我解下...
    杭玉邰!\/bin\/bash dir1=\/etc file=($(ls $dir1 -l | grep ^- | awk '{print $NF}'))for i in ${file[@]};do ls ${dir1}\/${i} -l | awk '{if($5>1024)print $NF}' | xargs -i mv {} \/tmp done

  • 19314193360在Linux系统下,编写一个Shell脚本,从键盘读入5个整数,然后显示最大数...
    杭玉邰!\/bin\/bash 任意输入5个数,判断最大值,最小值,总和 s=0 read -p "please input:" num s=$(($s+$num))max=$num min=$num avg=$(($s\/5))for i in `seq 4`do read -p "please input:" nums=$(($s+$num))if [ $num -le $min ];thenmin=$numfi if [ $num -ge ...

  • 19314193360编写一个shell脚本,自动将用户目录下所有小于5k的文件打包成tar.gz...
    杭玉邰楼上的这句 for info in 会把用户目录下的子目录内的文件也找出来 下面我写的 !\/bin\/bash for filename in `ls -l HOME |grep ^- |awk '{if($5<5120){print NF}}'`do filelist="$filelist filename"done tar cvfz usr.tar.gz filelist 或者下面更简单的一条语句搞定:ls -l HOME ...

  • 19314193360一个简单的功能shell脚本,怎么写
    杭玉邰基于文本文档(Markdown) 设想好需要的基本需要的表、字段、类型;使用 Rails Migration 随着功能的开发逐步创建表;随着细节功能的开发、需求,逐步增加字段,删除字段,或者调整字段类型;第一个 Release 的时候清理 Migrations 合并成一个;随着后期的改动,逐步增加、修改、删除字段或表。基本上我的所有项目...

  • 19314193360Linux的shell编程:题目要求写一个脚本能够基本达到ls -R这个命令的效果...
    杭玉邰解答:1,会受到改变,如果那行改成ls -l可以达到同样的目标,而且更易读一些。但是如果用List 就会调用一次List本身,就会改变目录位置,因此最后加一个CD $1回到主目录。2,第二个List中的唯一区别是没有cd $1.就是说LS $1只能显示目录,但是不在目录下面。你怎么判断 -d,因此循环只在脚本目录...

  • 19314193360在linux中写出一个shell脚本,打印输出1~5的平方
    杭玉邰!\/bin\/bash read -p "please input a number:" num sum=0 for ((i=1;i<=$num;i++))do sum=$[$i**2+$sum]done echo $sum 注释:num:输入的数;sum:保存结果;i**2:求平方

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网