【问题标题】:How do I get a list of filenames at runtime, some with spaces, into an array?如何在运行时将文件名列表(有些带有空格)放入数组中?
【发布时间】:2015-10-28 15:44:34
【问题描述】:

我需要将文件名列表放入一个数组中,让用户选择一个。

for i in $(ls -1 *.tgz*); do
  optstring="$optstring \"$i\""
done
options=($optstring)

无论是否引用输入,这都有效。但是它们仍然被 for 循环分割成空格。

【问题讨论】:

  • optstring 不是数组。还有Don't parse ls。只需在 glob 上使用循环。或者最好不要打扰循环。只需使用options=(*.tgz*)。另请参阅Bash FAQ 050,了解为什么不能将引号插入字符串并使其按您想要的方式工作。
  • 你是对的,o=(.tgz) 有效,不知道 bash 做了那个。比弄乱 IFS 或其他一些复杂的方式要容易得多。谢谢!

标签: bash filenames spaces quoting


【解决方案1】:

optstring 不是数组,顾名思义,它是一个字符串。这将是一个以后的问题。请参阅Bash FAQ 050,了解为什么不能将引号插入这样的字符串并使其按您想要的方式工作。

还有Don't parse ls

只需在 glob 上使用循环。

for i in *.tgz*; do ... done

甚至比这更好,甚至不用循环。

options=(*.tgz*)
printf '[%s]\n' "${options[@]}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2012-02-25
    • 2011-04-30
    • 1970-01-01
    相关资源
    最近更新 更多