免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4999 | 回复: 3
打印 上一主题 下一主题

[学习共享] 求教为何循环里面不能再次查询 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-10-24 13:37 |只看该作者 |倒序浏览
本帖最后由 ox_one 于 2017-10-24 13:42 编辑

各位,求教个问题。循环里面第二次调用函数的时候(也就是想第二次查询的时候) 会自动载入上次read的值 或直接输出上次的结果 我不需要这个结果 我需要能再次输入其他的选择进行查询

[root@balance scripts]# bash test.sh

tarball:   检查 源码包或二进制包
exit:      退出脚本

输入需要执行的任务名或需要安装的软件名(小写): tarball
输入正确,即将执行指定任务:tarball
即将检查源码包(或二进制包)
请选择其中一个需要检查的软件名:zlib、openssl、openssh
请输入软件名(小写): openssh
正在检查安装 openssh 所需的源码包(或二进制包)是否存在
-- 已找到源码包(或二进制包): openssh-7.6p1.tar.gz
-- 已找到源码包(或二进制包): zlib-1.2.11.tar.gz
-- 已找到源码包(或二进制包): openssl-1.0.2l.tar.gz
已完成 openssh 所需的源码包(或二进制包)检查

tarball:   检查 源码包或二进制包
exit:      退出脚本

输入需要执行的任务名或需要安装的软件名(小写): tarball
输入正确,即将执行指定任务:tarball
即将检查源码包(或二进制包)
请选择其中一个需要检查的软件名:zlib、openssl、openssh
-- 已找到源码包(或二进制包): openssh-7.6p1.tar.gz
-- 已找到源码包(或二进制包): zlib-1.2.11.tar.gz
-- 已找到源码包(或二进制包): openssl-1.0.2l.tar.gz
已完成 openssh 所需的源码包(或二进制包)检查

tarball:   检查 源码包或二进制包
exit:      退出脚本

输入需要执行的任务名或需要安装的软件名(小写):


脚本源码:
#!/bin/bash
#
# 检查软件源码包是否存在
function check_software_tarball()
{
echo "请选择其中一个需要检查的软件名:zlib、openssl、openssh"
check_software_list=(zlib openssl openssh)
while [ "$check_software_input_return_value" != "0"
do
    read -p "请输入软件名(小写): " ask_check_software_list
    if echo "${check_software_list[@]}" | grep -qw "$ask_check_software_list" ; then
        echo "正在检查安装 $ask_check_software_list 所需的源码包(或二进制包)是否存在"
        check_software_input_return_value=0
    else
        echo "输入有误,请重新输入"
        check_software_input_return_value=1
    fi
done

tarball_character_zlib="zlib-1.2.*.tar.gz"
tarball_character_openssl="openssl-1.*.tar.gz"
tarball_character_openssh="openssh-*.*p*.tar.gz"

case "$ask_check_software_list" in
    "zlib" )
    tarball_character=("$tarball_character_zlib")
    ;;
    "openssl" )
    tarball_character=("$tarball_character_openssl" "$tarball_character_zlib")
    ;;
    "openssh" )
    tarball_character=("$tarball_character_openssh" "$tarball_character_zlib" "$tarball_character_openssl")
    ;;
esac

for tarball_character_one in "${tarball_character[@]}"
do
check_tarball_name=$(find -maxdepth 1 -type f -name "$tarball_character_one" | sed 's/^\.\///' | sort -n | tail -1)
if [ ! "$check_tarball_name" ] ; then
    echo " -- 未找到 $(echo "$tarball_character_one" | awk -F - '{print $1}') 的源码包(或二进制包)"
else
    echo " -- 已找到源码包(或二进制包): $check_tarball_name"
fi
done

echo "已完成 $ask_check_software_list 所需的源码包(或二进制包)检查"
}


while true
do
echo
echo "tarball:   检查 源码包或二进制包"
echo "exit:      退出脚本"
echo

task_list=(tarball exit)
read -p "输入需要执行的任务名或需要安装的软件名(小写): " select
if echo "${task_list[@]}" | grep -w "$select" &>/dev/null; then
    input_return_value=0
else
    input_return_value=1
fi

if [ "$input_return_value" != "0" ] ; then
    echo "输入有误,请重新输入"
else
    echo "输入正确,即将执行指定任务:$select"
    case $select in
        "tarball" )
        echo "即将检查源码包(或二进制包)"
        check_software_tarball
        ;;

        "exit" )
        echo "---- 脚本已退出 ----"
        echo
        exit
        ;;
    esac
fi
done


请问问题是出在哪里?如何解决?


论坛徽章:
0
2 [报告]
发表于 2017-10-24 13:54 |只看该作者
刚刚测试了下
在循环 while [ "$check_software_input_return_value" != "0" 前面添加一行:
check_software_input_return_value=1
即可解决 ……

论坛徽章:
0
3 [报告]
发表于 2017-10-24 14:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
25
程序设计版块每日发帖之星
日期:2016-05-03 06:20:0015-16赛季CBA联赛之八一
日期:2018-07-05 10:34:09黑曼巴
日期:2018-07-06 15:19:5015-16赛季CBA联赛之佛山
日期:2018-08-03 13:19:3315-16赛季CBA联赛之山西
日期:2018-08-07 19:46:2315-16赛季CBA联赛之广夏
日期:2018-08-08 19:31:5015-16赛季CBA联赛之青岛
日期:2018-11-26 15:21:5015-16赛季CBA联赛之上海
日期:2018-12-11 09:45:3219周年集字徽章-年
日期:2020-04-18 23:54:5215-16赛季CBA联赛之深圳
日期:2020-04-19 21:40:19黑曼巴
日期:2022-04-03 17:55:1315-16赛季CBA联赛之八一
日期:2018-07-03 16:56:46
4 [报告]
发表于 2017-10-24 18:10 |只看该作者
回复 1# ox_one


把代码优化一下:
  1. #!/bin/bash
  2. #
  3. # 检查软件源码包是否存在
  4. function check_software_tarball()
  5. {
  6. echo "请选择其中一个需要检查的软件名:zlib、openssl、openssh"
  7. read -p "请输入软件名(小写): " ask_check_software_list
  8. echo "正在检查安装 $ask_check_software_list 所需的源码包(或二进制包)是否存在"

  9. tarball_character_zlib="zlib-1.2.*.tar.gz"
  10. tarball_character_openssl="openssl-1.*.tar.gz"
  11. tarball_character_openssh="openssh-*.*p*.tar.gz"

  12. case "$ask_check_software_list" in
  13.     "zlib" )
  14.     tarball_character=("$tarball_character_zlib")
  15.     ;;
  16.     "openssl" )
  17.     tarball_character=("$tarball_character_openssl" "$tarball_character_zlib")
  18.     ;;
  19.     "openssh" )
  20.     tarball_character=("$tarball_character_openssh" "$tarball_character_zlib" "$tarball_character_openssl")
  21.     ;;
  22.     *)
  23.     echo "输入有误,请重新输入"
  24.     ;;
  25. esac

  26. for tarball_character_one in "${tarball_character[@]}"
  27. do
  28. check_tarball_name=$(find -maxdepth 1 -type f -name "$tarball_character_one" | sed 's/^\.\///' | sort -n | tail -1)
  29. if [ ! "$check_tarball_name" ] ; then
  30.     echo " -- 未找到 $(echo "$tarball_character_one" | awk -F - '{print $1}') 的源码包(或二进制包)"
  31. else
  32.     echo " -- 已找到源码包(或二进制包): $check_tarball_name"
  33. fi
  34. done

  35. echo "已完成 $ask_check_software_list 所需的源码包(或二进制包)检查"
  36. }


  37. while true
  38. do
  39. echo
  40. echo "tarball:   检查 源码包或二进制包"
  41. echo "exit:      退出脚本"
  42. echo

  43. read -p "输入需要执行的任务名或需要安装的软件名(小写): " select
  44.     case $select in
  45.         "tarball" )
  46.         echo "即将检查源码包(或二进制包)"
  47.         check_software_tarball
  48.         ;;

  49.         "exit" )
  50.         echo "---- 脚本已退出 ----"
  51.         echo
  52.         exit
  53.         ;;
  54.         *)
  55.         echo "输入有误,请重新输入"
  56.         ;;
  57.     esac
  58. done
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP