问个弱智问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
chuihero
帖子: 3
注册时间: 2008-01-26 14:54

问个弱智问题

#1

帖子 chuihero » 2010-05-20 23:08

下面时linux编程基础中的一个shell程序的例子

代码: 全选

#!/bin/sh
yes_or_no() {
     echo “Is your name $* ?”
    while true
    do
        echo -n “Enter yes or no: “
        read x
        case “$x” in
            y | yes ) return 0;;
            n | no ) return 1;;
            * )  echo “Answer yes or no”
        esac
    done
}

echo “Original parameters are $*”

if yes_or_no “$1”
then
    echo “Hi $1, nice name”
else
    echo “Never mind”
fi
exit 0
输出如下:(./my_name是文件名)
$ ./my_name Rick Neil
Original parameters are Rick Neil
Is your name Rick ?
Enter yes or no: yes
Hi Rick, nice name
$


为什么函数yes_or_no 返回0时,if认为是真,返回1时,if认为是假呢?
头像
wowoto
帖子: 3050
注册时间: 2009-04-11 12:17
系统: windows7

Re: 问个弱智问题

#2

帖子 wowoto » 2010-05-21 1:43

...弱智问题还在这里问...
wowoto>ubuntu8.04>ubuntu9.04>Archlinux>FreeBSD8.0>Archlinux & end here.
chuihero
帖子: 3
注册时间: 2008-01-26 14:54

Re: 问个弱智问题

#3

帖子 chuihero » 2010-05-21 21:24

这里不是高手多吗,能给我直接的答复。
头像
ptpt52
帖子: 717
注册时间: 2008-07-27 8:51
系统: Ubuntu/Windows
来自: 广西玉林|广东深圳
联系:

Re: 问个弱智问题

#4

帖子 ptpt52 » 2010-05-21 21:31

chuihero, 你说得太对了,就是这样的,程序或者函数返回0表示其正常退出,为真,返回非0则认为是异常退出,为假。别先入为主,和你学的0为假1为真搞混了
走过去了也便有了路
http://www.ptpt52.com/
chuihero
帖子: 3
注册时间: 2008-01-26 14:54

Re: 问个弱智问题

#5

帖子 chuihero » 2010-05-23 23:08

Thanks,理解起来有点麻烦……
aerofox
帖子: 1453
注册时间: 2008-05-24 8:30

Re: 问个弱智问题

#6

帖子 aerofox » 2010-06-03 6:13

因为成功的情况一般来说只有一种,而出错的原因去可能各种各样,所以成功用 0 来表示,出错用非 0 来表示,这样可以用不同的非 0 值来表示不同的错误。
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: 问个弱智问题

#7

帖子 poet » 2010-06-03 14:13

chuihero 写了: 为什么函数yes_or_no 返回0时,if认为是真,返回1时,if认为是假呢?
这是一个历史原因,很多人可能不清楚。

在多数 CPU 中,只有判断一个数是否为零的指令,没有判断是否为1的指令。

因此,判断一个数是否为零,只需要一条指令。

而判断一个数是否为1,需要两条指令,先把它减1,然后判断它是否为零。

所以说,在效率至上的年代,认为判断是否为零具有最高的效率,应当让程序在“正常情况下”都具有最高的效率。因此,那个年代就制定出了如果成功或者一切正常,应该返回零的规定。


严格的说来,在当今的 CPU 性能和体系下,这点性能差异其实是可以忽略不计的,一些新的语言应当提倡使用 1 来表示成功。但是由于 Unix 本身诞生的历史非常悠久,一些已经决定的事实是不容易改变的。

Linus 曾在 Linux 编程规范中详细的说明了对 0 的使用,但是他的这个规范也并非每人都去遵守,否则楼主那样的程序就不会出现了。至少根据他的那个规定,yes应当为 1,no 应当为 0。
上次由 poet 在 2010-06-03 14:47,总共编辑 1 次。
头像
tenzu
论坛版主
帖子: 36924
注册时间: 2008-11-21 20:26

Re: 问个弱智问题

#8

帖子 tenzu » 2010-06-03 14:41

poet 写了:
chuihero 写了: 为什么函数yes_or_no 返回0时,if认为是真,返回1时,if认为是假呢?
这是一个历史原因,很多人可能不清楚。

在多数 CPU 中,只有判断一个数是否为零的指令,没有判断是否为1的指令。

因此,判断一个数是否为零,只需要一条指令。

而判断一个数是否为1,需要两条指令,先把它减1,然后判断它是否为零。

所以说,在效率至上的年代,认为判断是否为零具有最高的效率,应当让程序在“正常情况下”都具有最高的效率。因此,那个年代就制定出了如果成功或者一切正常,应该返回零的规定。


严格的说来,在当今的 CPU 性能和体系下,这点性能差异其实是可以忽略不计的,一些新的语言应当提倡使用 1 来表示成功。但是由于 Unix 本身诞生的历史非常悠久,一些已经决定的事实是不会改变的。
学习了 :em11
头像
xieshaohu
帖子: 1565
注册时间: 2007-10-24 20:20
来自: 北京、海淀
联系:

Re: 问个弱智问题

#9

帖子 xieshaohu » 2010-06-03 17:54

已经习惯了0表示成功,0以外表示失败了。

从设计的角度来看,如果用0表示成功,可以用不同的非零值表示不同的错误类型,个人感觉这个还是挺好理解的。
Dell Vostro 1500, T7300/4GB/WD5000BEVT/nVidia 8400GM, Ubuntu 10.04 x86_64/VMware 7(Win7)
我的博客:http://xieshaohu.wordpress.com/
禁飞区
帖子: 7
注册时间: 2010-12-15 8:48

Re: 问个弱智问题

#10

帖子 禁飞区 » 2010-12-16 13:26

受教了.
头像
linxiaoyu
帖子: 39
注册时间: 2009-05-03 21:09

Re: 问个弱智问题

#11

帖子 linxiaoyu » 2010-12-17 13:59

if 判断表达式或是命令时, 一个规定就是0 就执行,非零pass
跟C语言明显不一样,楼主别弄混了。
GONE WITH THE WIND ~~~
头像
liu滔
帖子: 7214
注册时间: 2010-10-09 23:01

Re: 问个弱智问题

#12

帖子 liu滔 » 2010-12-17 19:34

虽然C语言里的if语句会将1视为真而将1以外的数(所以也就包括0……)视为假,但其实我一般如果写函数的返回值来表示函数的执行是否是预期的情况的话,还是用0来表示成功,而用0以外的数(包括1……)来表示失败的…… :em09
头像
退避九舍
帖子: 742
注册时间: 2010-08-08 20:02
系统: Ubuntu 22.04

Re: 问个弱智问题

#13

帖子 退避九舍 » 2010-12-17 20:02

liu滔 写了:虽然C语言里的if语句会将1视为真而将1以外的数(所以也就包括0……)视为假,但其实我一般如果写函数的返回值来表示函数的执行是否是预期的情况的话,还是用0来表示成功,而用0以外的数(包括1……)来表示失败的…… :em09
貌似在C语言中,0为假,非0即为真。
退避九舍:富贵不能淫,贫贱不能移,威武不能屈:坚持ubuntu不动摇!
回复