You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将ls -Q输出的带引号条目存入Bash数组(保留引号)

如何将ls -Q的带引号条目存入数组并保留引号

我来帮你搞定这个问题!你遇到的核心问题是:直接把ls -Q的输出赋值给变量再拆分数组时,Shell会把空格(包括引号内的空格)当成元素分隔符,而且不会解析引号,导致带空格的条目被拆成多个元素。下面给你两种靠谱的解决方法:

方法一:用eval解析引号(简单直接)

这种方法利用eval让Shell重新解析带引号的内容,正确识别字符串边界:

# 获取ls的带引号输出
result=$(ls -Q)
# 用eval解析引号并存入数组
eval ARRAY=($result)

验证一下效果:

echo ${ARRAY[0]}  # 输出:"folder2"
echo ${ARRAY[1]}  # 输出:"folder space"
echo ${ARRAY[2]}  # 输出:"test 123"

原理:eval会让Shell重新处理$result的内容,把双引号当成字符串的边界标记,这样带空格的条目就会被作为一个完整的数组元素,同时保留引号本身。

方法二:用read配合进程替换(更安全)

如果你担心eval的潜在风险(比如文件名包含特殊字符时),可以用read命令配合进程替换来实现,更稳妥:

# 设置IFS为换行符,按行读取每个条目
IFS=$'\n' read -r -d '' -a ARRAY < <(ls -Q)

参数解释:

  • IFS=$'\n':把内部字段分隔符设为换行,让read将每行作为一个独立元素,避免空格拆分。
  • -r:禁止反斜杠转义,保留文件名的原始格式。
  • -d '':让read读取到输入结束(EOF),确保所有条目都被存入数组。
  • -a ARRAY:指定将读取的内容存入ARRAY数组。
  • < <(ls -Q):通过进程替换,把ls -Q的输出直接传给read作为输入。

这个方法同样能完美保留每个条目的引号,且正确处理带空格的文件名。

为什么直接ARRAY=($result)不行?

举个例子,如果result的内容是"folder2" "folder space" "test 123",直接执行ARRAY=($result)时,Shell会忽略引号的存在,单纯按空格拆分内容,最终数组元素会变成:"folder2"、"folder、space"、"test、123",这显然不是你想要的结果。

内容的提问来源于stack exchange,提问作者Mathew Smith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:56:27