【问题标题】:Bash: Read args from stdin into arrayBash:将参数从标准输入读入数组
【发布时间】:2016-12-25 23:47:50
【问题描述】:

问题描述

给定一个包含一行命令行参数的纯文本文件args.in,将它们读入一个数组。

问题表述

我们有 4 个文件:


args.in

"ab" c

refimpl.sh

read -r line
bash -c "bash showargs.sh $line"

arrayimpl.sh:

arr=()

# BEGIN-------------------------
# Input comes from stdin.
# You need to set arr here.
# END---------------------------

echo "${#arr[@]}"
for i in "${arr[@]}"; do
    echo "$i"
done

showargs.sh

echo "$#"
for i in "$@"; do
    echo "$i"
done

将它们放在同一个文件夹中。我们希望您实现arrayimpl.sh,以便

bash refimpl.sh < args.in

bash arrayimpl.sh < args.in

给出相同的输出。

您的解决方案应该只包含一个文件arrayimpl.sh

输出示例

2
ab
c

这个问题是this 的更好表述,但不是this 的重复。一些解决方案在那里工作,但不是在这里。例如,当我们有以下输入时:

args.in:

"a\"b" c

目前还没有已知的解决方案。

【问题讨论】:

  • @sorontar 我希望脚本从标准输入读取。所以他们被称为./refimpl.sh &lt; args.in。该部分已修复。
  • @StevenPenny 在此处添加 shebang 会使问题变得更长。我认为任何一种方式都不会影响结果。
  • 如果输入在标准输入上以"a b" c 之类的形式出现,您可以使用eval "arr=( $(cat) )"
  • @thatotherguy 那你为什么不写一个答案呢?我测试了几个输入,看起来不错。我唯一担心的是eval 的潜在风险很难驾驭。
  • 使用eval 没有refimpl.sh 没有的风险或问题。

标签: arrays bash shell arguments lexical-analysis


【解决方案1】:

这个作业的预期解决方案相当于:

eval "arr=( $(cat) )"

这会将输入评估为 shell 单词,refimpl.sh 也是这样做的。

这仅适用于玩具问题和家庭作业。真正的软件不应该使用可执行代码作为数据格式。

【讨论】:

  • 我不在电脑附近,但它看起来就像refimpl.sh 一样工作,这是 OP 所要求的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
相关资源
最近更新 更多