LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1024|回复: 2

请教shell编程的问题

[复制链接]
发表于 2003-8-22 20:07:33 | 显示全部楼层 |阅读模式
下面这段脚本,在Mandrake8.2环境下可以正常运行。在slackware9.0的安装光盘里的
initrd展开获得的linux环境下就不能正常的运行。
typeset -a hds
[ -n "$(echo /proc/ide/hd* 2>/dev/null)" ] && hds=( $( echo /proc/ide/hd*) )
[ -n "$hds" ] && hds=( ${hds
  • ##*/} )
    [ -z "$hds" ] && hds=(hda hdb hdc hdd hde hdf hdg hdh)
    for device in ${hds
  • }; do
    [ -e "/proc/ide/${device}/media" ] || continue
    hdmedia=`cat /proc/ide/${device}/media`

    if [ $hdmedia = cdrom ] ; then
      ln -s /dev/${device} /dev/cdrom
    fi


    done



    问题出在“hds=( $( echo /proc/ide/hd*) )"和"hds=( ${hds
  • ##*/} )"部分。
    请各位高人指点有没有方法用另外一种方法来实现??
    另外:/proc/ide/hd*/有什么方法可以将hd*单独提取出来???
  • 发表于 2003-8-23 08:47:26 | 显示全部楼层
    没怎么用过这两种发行版,能说一下两种环境下的shell具体是个什么,比如env 输出的信息?
    发表于 2003-8-25 12:09:51 | 显示全部楼层
    先来hds=($(echo /proc/ide/hd*)) :
    首先运行echo /proc/ide/hd* --$()等于``,得到你的机器上有的驱动器路径。
    在我的机器上运行结果如下:
    $echo /proc/ide/hd*
    /proc/ide/hda /proc/ide/hdb /proc/ide/hdd
    然后,在$(echo /proc/ide/hd*)外面的括号是把echo的输出当做hds数组的元素,分隔符由IFS的第一个字符决定,一般为空格,所以这句运行后的结果为:hds=([0]="/proc/ide/hda" [1]="/proc/ide/hdb" [2]="/proc/ide/hdd")

    接着到hds=(${hds
  • ##*/}):
    也是先运行里面的东西:${hds
  • ##*/},这里表示删除变量$hds中每个元素的前导路径名,而后又把结果赋给hds,则刚才我们的hds数组就变成了:
    hds=([0]="hda" [1]="hdb" [2]=hdd")

    补充一句:这个脚本是bash来的,要用bash2.0以上运行。如果想深入学习的话可以找O'Reilly 出版社的《learning the bash shell》。

    [qoute]

    问题出在“hds=( $( echo /proc/ide/hd*) )"和"hds=( ${hds
  • ##*/} )"部分。
    请各位高人指点有没有方法用另外一种方法来实现??
    另外:/proc/ide/hd*/有什么方法可以将hd*单独提取出来???

    [/qoute]
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    快速回复 返回顶部 返回列表