【问题标题】:Each string with quotes around it as own element in array每个带有引号的字符串作为数组中的自己的元素
【发布时间】:2023-03-23 09:14:01
【问题描述】:

我正在尝试将result=$(ls -Q) 返回的每个项目都放入数组中。

如果我回显result,它看起来像这样:"folder2" "folder space" "test 123"。请注意,有些项目包含空格

如何将每个项目放在数组中的引号周围(引号必须保留在那里)。我想要的输出是:

echo ${ARRAY[0]}  --> "folder2"
echo ${ARRAY[1]}  --> "folder space"
echo ${ARRAY[2]}  --> "test 123"

我怎样才能做到这一点?

【问题讨论】:

标签: bash shell ls


【解决方案1】:

像这样使用filename expansion

ARRAY=(*)

例子:

mkdir test
cd test
# Create file with space in name
touch 'foo bar'
# Create file with newline in name
touch 'hello
world'

files=(*)

for file in "${files[@]}" ; do
    echo "name: ${file}"
done

输出:

name: foo bar                                                                                                                         
name: hello                                                                                                                           
world

【讨论】:

    【解决方案2】:

    不要解析 ls 的输出。即使使用-Q,它也已经坏了。在我的有毒文件名目录中,我得到了这个:

    res=(*)
    for f in "${res[@]}"; do echo "file: $f"; done 
    
    file: 1 file.tar.gz
    file: 2 file.tar.gz
    file: 3 file.tar.gz
    file: 4 file.tar.gz
    file: 5 file.tar.gz
    file: abc3<foo.mp3
    file: bb bb
    file: dd dd
    file: ff ff
    file: file-mit"Quote"
    file: m d.sh
    file: regex=*a*
    file: zeilen
    umbruch.zip
    

    我的第一个答案和评论是错误的:

    ls -Q
    "1 file.tar.gz"  "3 file.tar.gz"  "5 file.tar.gz"  "bb bb"  "ff ff"              "m d.sh"     "zeilen\numbruch.zip"
    "2 file.tar.gz"  "4 file.tar.gz"  "abc3<foo.mp3"   "dd dd"  "file-mit\"Quote\""  "regex=*a*"
    
    result=($(ls -Q))
    for f in ${result[@]}; do echo "file $f"; done 
    
    file "1
    file file.tar.gz"
    file "2
    file file.tar.gz"
    file "3
    file file.tar.gz"
    file "4
    file file.tar.gz"
    file "5
    file file.tar.gz"
    file "abc3<foo.mp3"
    file "bb
    file bb"
    file "dd
    file dd"
    file "ff
    file ff"
    file "file-mit\"Quote\""
    file "m
    file d.sh"
    file "regex=*a*"
    file "zeilen\numbruch.zip"
    

    【讨论】:

    • 文件名有空格为什么要换行?
    • 更新本身并没有错,但这不是你应该的事情。你会从res=*; for f in $res; do 得到相同的结果;该数组没有被用于任何实际目的。 ${...[@]} 应该总是被引用,否则它与${...[*]} 没有什么不同。相反,让 glob 在数组赋值 (res=(*)) 中展开,然后使用 for f in "${res[@]}"; do 遍历正确引用的结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-20
    • 2021-08-02
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    相关资源
    最近更新 更多