如何在Bash中循环遍历列表的特定元素?

时间:2018-04-05 12:54:04

标签: bash file-processing

我有一个存储在通过输入

获得的变量中的文件列表
$users = array();

$stmt = $mysqli->query('SELECT id, last_active FROM users WHERE status = 1');
while ($row = $stmt->fetch_assoc()) {
    $tempArray = []; // added
    $tempArray[] = $row['id'];
    $tempArray[] = $row['last_active'];
    $users[] = $tempArray; // added
}

echo json_encode($users);

我想创建一个循环的for循环:前200个元素,元素201-400,元素401-578,例如。

我怎样才能做到这一点?我试过像

这样的东西
$users[] = array($row['id'],$row['last_active']);

但显然这不起作用。

3 个答案:

答案 0 :(得分:4)

建议不要使用变量填充文件列表。最好的方法是使用数组!

您需要通过执行shopt -s nullglob来启用shell选项以避免空全局扩展,这样如果没有找到文件,则for循环将正常退出。下面的示例显示了一次迭代200个文件。您可以根据需要更改索引,以便在for循环中根据需要打印200-400和400-600。

shopt -s nullglob
files=(*.fasta)

if (( "${#files}" >= 200 )); then
    for ((i=0; i<200; i++)); do
        printf '%s\n' "${files[i]}"
    done
fi

答案 1 :(得分:1)

将它们放在一个数组中,然后使用子字符串扩展来获取批量文件。

files=(./*.fasta)
for ((i=0; i< ${#fasta[*]}; i+=200)); do
    process "${files[@]:i:200}" &
done

答案 2 :(得分:0)

问题可能有所不同。您可以使用findxargs

,而不是使用for循环
find * -name '*.fasta' -maxdepth 0 -print0 | xargs -0 -n 200 -P 0 echo

find将每个文件名传递给xargs,后者又为每200个输入文件(-P 0)生成一个进程(-n 200)。

这个单行使用-print0-0标记,以防您的文件名包含空格。

在这种情况下,for循环结构不太理想。

或者,您可以使用while循环和内置的readarray:

find * -name '*.fasta' -maxdepth 0 | while readarray -n 3 a && [[ ${#a} -ne 0 ]]
do
    echo ${a[@]}
done