【问题标题】:How to have a user select a value from array and pass that into a variable in KSH如何让用户从数组中选择一个值并将其传递给 KSH 中的变量
【发布时间】:2014-12-25 10:30:23
【问题描述】:

概述:
我希望我的 KSH 脚本测试目录中是否存在某些文件,向用户提供这些文件的列表以及一个数字。然后用户选择他们想要的数字,并将数组中的相关值分配给一个变量。



到目前为止,我有以下内容:

### Create test files in directory ####
touch ABCDEF.jar
touch BCDEFG.jar
touch CDEFGH.jar
touch DEFGHI.jar
touch EFGHIJ.jar
touch FGHIJK.jar
touch GHIJKL.jar


set -A JARS ` ls -1 | grep .jar | cut -d'.' --complement -f2-`
for i in ${JARS[@]}; do echo "Number) $i"; done

这会从数组中返回以下列表:

Number) ABCDEF
Number) BCDEFG
Number) CDEFGH
Number) DEFGHI
Number) EFGHIJ
Number) FGHIJK
Number) GHIJKL

首先,我想用一个函数来替换占位符“Number)”,该函数会按顺序增加数字以获得如下效果:

1) ABCDEF
2) BCDEFG
3) CDEFGH
4) DEFGHI
5) EFGHIJ
6) FGHIJK
7) GHIJKL

然后我想让脚本根据用户选择的数字读取用户输入,并将数组中的正确值分配给新变量“JAR_ID”



从表面上看,这似乎是一个简单的问题。但是,我似乎无法理解如何以合乎逻辑的方式执行此操作。

感谢任何想法!

TIA 哈士奇。

【问题讨论】:

  • 我没有意识到 Korn 有这个功能来构建选择菜单!但是,我将如何处理数组是动态生成的这一事实?
  • select file from *.jar
  • 我不确定我的系统上的 'select' 是否会做同样的事情 - man select SELECT(2) Linux Programmer's Manual SELECT(2) NAME select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO -同步 I/O 多路复用 select() 和 pselect() 允许程序监视多个文件描述符,等待一个或多个文件描述符“准备好”用于某种类型的 I/O 操作(例如,可能的输入)。如果可以在不阻塞的情况下执行相应的 I/O 操作(例如 read(2)),则认为文件描述符已准备就绪。
  • 这不是select(2)。这是 select 内置的 shell。

标签: arrays shell variables user-input ksh


【解决方案1】:

感谢 Etan 朝正确的方向戳,我能够使用以下代码做我需要的事情:

#!/bin/ksh

type_prompt='Select JAR> '
PS3="${type_prompt}"

select JAR in `ls -1 | grep .jar | cut -d'.' --complement -f2-` QUIT
do
        export NEW_PATCHID=$JAR
        echo $NEW_PATCHID
        REPLY=''
        break
done


这正是我所需要的,并以我想要的方式工作。再次感谢伊坦

【讨论】:

  • 你确实想像那样使用ls。你也不需要。如果该行中的普通 glob *.jar 不起作用(因为它包含太多)。您可以将该 glob 扩展为数组 jars=(*.jar),然后使用 shell 变量扩展或循环将字符串操作为所需的格式,然后为该行使用 select JAR in "${jars[@]}"
  • 谢谢伊坦。我会把这个带上船。就 shell 脚本的动态而言,我仍然是一个相对新手,并感谢您的建议。
【解决方案2】:

如果您不介意列表中的完整文件名,那么这将起作用。

select JAR in *.jar; do
        export NEW_PATCHID=$JAR
        echo $NEW_PATCHID
        REPLY=''
        break
done

如果您确实介意(并且示例表明您可能会)并且您想删除.jar(我假设这就是cut 的用途,尽管cut -d. -f1 看起来更简单,awk -F . '{print $1}'虽然这更长)以下工作安全。

jars=(*.jar)
select JAR in "${jars[@]%.jar}"; do
        export NEW_PATCHID=$JAR
        echo $NEW_PATCHID
        REPLY=''
        break
done

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 2022-12-08
    • 2017-11-24
    • 2018-04-14
    相关资源
    最近更新 更多