【问题标题】:Interactive bash script receiving user inputs [closed]接收用户输入的交互式 bash 脚本[关闭]
【发布时间】:2021-09-03 03:02:49
【问题描述】:

请原谅我的业余语言。

我已经编写了一个简单的单行代码来从一个巨大的文本文件中找出我想要的内容:

cat file | grep "value" | cut -f1 -d":"

它从那里输出文件路径行。

我希望它继续这样做:

  1. cd 一次一行进入路径。
  2. 每次在cd 之后运行此命令: ls | grep .fileformat
  3. 然后让我运行 3 个我选择的命令,如果我按 [return] 没有任何值,它将忽略并侦听下一个命令。三个完成后,它会继续。
  4. cd 进入下一行的目录并重复直到最后一行。

很抱歉,我无法弄清楚这部分,因为我什至不知道从哪里开始搜索。

感谢您的收看!

编辑 1:我的初始命令的输出给出如下路径:

/home/user/path/to/file

所以没有~,应该可以cd进去没问题吧?

【问题讨论】:

  • 第三步的命令怎么选?您确定必须 cd 进入各个目录吗?您如何处理步骤 2 的输出? ls | grep 有一些问题,.fileformat 几乎肯定会匹配您不打算匹配的内容(. 是匹配所有内容的正则表达式特殊字符)。
  • @BenjaminW。我只是将 rm 和 cat 列出的文件 ls |例如 grep .mkv。我尝试了 ls 命令,它对我来说完美无缺
  • grep value file 代替cat file | grep value。 1中的路径是什么?如果你在 sub-sell() 中 cd 它将恢复到已知目录,否则你必须跟踪它们,除非它们是绝对路径。
  • @AllanWind 道歉我不知道已知的指令是什么,但我的命令的输出(尽管你指出的效率低下)给出了这个:/home/user/file/path。所以我想这些路径是“绝对的”。不喜欢〜或软链接
  • sed 通常是一个不错的选择,而不是 grep + cut per below。

标签: bash interactive


【解决方案1】:

Allan Wind 答案的略微修改版本,可以满足我认为 OP 想要的功能(尝试以评论的形式回复 Allan,但无法正确确定代码格式):

sed -n '/value/s/\([^:]*\):.*/\1/p' file | while read d
do
  echo -e "Entering $d"
  cd $d
  ls | grep .fileformat
  for i in {1..3}; do
    echo -e "Type your command #${i}:\n"
    read -p '>' input < /dev/tty
    [ -z "$input" ] && echo -e "\nDoing nothing this time...\n" && continue
    eval "$input"
  done
done

(交互阅读的常见注意事项 + 使用 eval 很危险)

【讨论】:

    【解决方案2】:

    以下是帮助您提出更好问题的答案框架:

    sed -n '/value/s/\([^:]*\):.*/\1/p' file | while read d
    do
      (
         cd d
         ls | grep .fileformat
         read -p  "3 commands? " c
         [ -z "$c" ] && continue
         cd d
         eval "$c"
      )
    done
    

    (交互阅读的常见注意事项 + 使用 eval 很危险)

    【讨论】:

    • 谢谢,我需要一些时间来消化。希望我不会再打扰论坛了。
    • 别担心,我们随时为您提供帮助,只需将其标记为已回答,以便我们知道您已准备就绪。 eval 很可怕,因为它允许你做任何事情,所以如果是我,我会寻求改变问题......是否有有限的命令集?如果是这样,那么您为每个函数编写一个函数,并让程序选择定义的函数。你能更好地自动化“查看 ls 的输出并决定应该运行哪些命令”吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多