Linux CASE语句后继续函数

Linux CASE语句后继续函数,linux,bash,Linux,Bash,我有这个功能 function doit { echo " Do you want to continue? {y/n} " case $opt in y) ?????? n) exit ;; esac echo " 32b or 64b? {32/64} " case $opt in 32) do32 ;; 64) do64 ;; esac } 我该怎么做?在选择“是”之后,我需要在相同的函数中继续前进。这非常不清楚,但我想你的意思是

我有这个功能

function doit {
  echo " Do you want to continue? {y/n} "
  case $opt in
    y) ??????
    n) exit ;;
  esac
  echo " 32b or 64b? {32/64} "
  case $opt in
    32) do32 ;;
    64) do64 ;;
  esac
}

我该怎么做?在选择“是”之后,我需要在相同的函数中继续前进。

这非常不清楚,但我想你的意思是

doit () {
   read -p " Do you want to continue? {y/n} " opt
   case $opt in
     y) ;;
     n) return 1 ;;
   esac
   read -p " 32b or 64b? {32/64} " opt
   case $opt in
    32) do32 ;;
    64) do64 ;;
   esac
}
y
案例中选择什么都不做似乎是对您问题的答案。但是还要注意使用
return
而不是
exit
来离开函数,在函数声明中没有
function
关键字(这实际上只是一个偏好问题;但是我看不到Bash only语法变体的优点),以及使用
read
来读取输入(我想这就是你想要的?)
return
参数
1
向调用者发出失败信号,因此你可以说

doit || echo "$0: doit failed or aborted" >&2

严格地说,第一个
案例
只需要一个
n
分支;您会注意到,如果答案不是
n
y
,那么代码就是失败的,而这种行为实际上也适用于
y
案例。如果不是这种情况,则是最终的
*)
大小写可以用来处理所有未处理的值。

这一点非常不清楚,但我想你的意思是

doit () {
   read -p " Do you want to continue? {y/n} " opt
   case $opt in
     y) ;;
     n) return 1 ;;
   esac
   read -p " 32b or 64b? {32/64} " opt
   case $opt in
    32) do32 ;;
    64) do64 ;;
   esac
}
y
案例中选择什么都不做似乎是对您问题的答案。但是还要注意使用
return
而不是
exit
来离开函数,在函数声明中没有
function
关键字(这实际上只是一个偏好问题;但是我看不到Bash only语法变体的优点),以及使用
read
来读取输入(我想这就是你想要的?)
return
参数
1
向调用者发出失败信号,因此你可以说

doit || echo "$0: doit failed or aborted" >&2

严格地说,第一个
案例
只需要一个
n
分支;您会注意到,如果答案不是
n
y
,那么代码就是失败的,而这种行为实际上也适用于
y
案例。如果不是这种情况,则是最终的
*)
case可用于处理所有未处理的值。

如果您只关心其中一个分支,我不会使用
case
语句:

function doit {
    read -p " Do you want to continue? {y/n} " ans
    [[ $ans == [nN]* ]] && return 1

    PS3=" 32b or 64b? "
    select size in 32 64; do
        case $size in
            32|64) break ;;
        esac
    done
    do${size}
}

当您只关心其中一个分支时,我不会使用
case
语句:

function doit {
    read -p " Do you want to continue? {y/n} " ans
    [[ $ans == [nN]* ]] && return 1

    PS3=" 32b or 64b? "
    select size in 32 64; do
        case $size in
            32|64) break ;;
        esac
    done
    do${size}
}

true
可以,或者它的等价物(当清楚退出状态实际上并不重要时,通常使用)
.BTW,如果您只想中止函数,而不是退出整个shell,那么您可能需要
返回
而不是
退出
。(您可能会考虑使用现代POSIX函数声明语法--
doit(){
,没有前面的
函数
——而不是支持向后兼容的古老ksh语法;请参阅;这样,您的代码将与基线POSIX shell(如ash/dash/等)一起工作,并且对于那些希望
函数
关键字在默认情况下使变量成为局部变量的老ksh用户来说,您的代码就不会那么让人困惑了,因为它没有这样做t在bash中)@CharlesDuffy很好,谢谢,
return
技巧在另一个函数上确实帮助了我:)
true;
就可以了,或者它的等价物(当退出状态显然并不重要时,通常使用)
:;
。顺便说一句,如果您只想中止函数,而不是退出整个shell,那么您可能需要
返回而不是
退出{
,没有前面的
函数
——而不是支持向后兼容的古老ksh语法;请参阅;这样,您的代码将与基线POSIX shell(如ash/dash/等)一起工作,并且对于那些希望
函数
关键字在默认情况下使变量成为局部变量的老ksh用户来说,您的代码就不会那么让人困惑了,因为它没有这样做t in bash)@CharlesDuffy好的,谢谢,那
return
技巧真的在另一个功能上帮了我的忙:)好的,一切都正常:)非常感谢你的朋友!!好的,一切都正常:)非常感谢你的朋友!!可能
[$ans=[yY]*]| | return 1
更安全……虽然如果没有使用其他扩展,
case
语句在可移植性方面肯定领先。可能
[[$ans=[yY]*]| | return 1
更安全……尽管
case
语句在可移植性方面肯定领先,如果没有使用其他扩展。