如何将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
相关产品推荐
相关产品推荐

