3

我想将排序方法的结果放入一个数组中,其中每个单元格都包含一个单词。我尝试了此代码,但仅打印了 $file 的一部分并且未对其进行排序:

#!/bin/bash
for file in `ls ${1}` ; do
    if [[ ! ($file = *.user) ]] ; then
        continue
    fi

    arr=(`sort -nrk4 $file`)
    echo ${arr[*]}

done

为什么这不起作用?我怎样才能做到这一点?

数据文件:

name1 01/01/1994 a 0
name2 01/01/1994 b 5
name3 01/01/1994 c 2

如果我只运行排序行(sort -nrk4 $file),这就是打印的内容:

name2 01/01/1994 b 5
name3 01/01/1994 c 2
name1 01/01/1994 a 0

当我运行上面的 2 行时,这就是它的打印内容:

 name1 01/01/1994 a 0
4

1 回答 1

1

为了将sort输出的每一行放入自己的数组元素中,IFS需要设置为换行符。要输出数组,您需要对其进行迭代。

#!/bin/bash
for file in $1; do
    if [[ ! $file = *.user ]]; then
        continue
    fi

    saveIFS=$IFS
    IFS=$'\n'
    arr=($(sort -nrk4 "$file"))
    IFS=$saveIFS
    for i in "${arr[@]}"
    do
        echo "$i"
    done

done

或者,不要重置IFS,不要使用循环输出,以下命令将输出由换行符分隔的元素,因为第一个字符IFS用于输出分隔符,当*用于引用上下文中的下标时:

echo "${arr[*]}"

请记住,引用可以解决所有问题。

不要lsfor循环中使用。如果$1可能包含通配符,则应不加引号。如果目录或文件名可能包含空格字符,则应该引用它。理想情况下,$1应在此处使用 的内容之前对其进行验证。

比较运算符的优先级高于否定运算符,因此不需要括号。

对于命令替换,$()优先于反引号。它们更具可读性并且更易于嵌套使用。

最后,当变量被扩展时,应该被引用。此外,@应该几乎总是用于下标数组。

于 2012-05-19T11:15:15.457 回答