Ошибка в цикле while

Я тоже нашел решение:

cat files.txt | while read f; do ls -la $f; done | awk '{s+=$5;} END {print s;}'
0
28.03.2018, 08:52
3 ответа

Вам нужно разделить эту testкоманду (и указать ваши расширения, если вы используете POSIX -совместимую оболочку):

[ "$d" -gt 0 ] && [ "${a[d-1]}" -gt "${a[d]}" ]
2
28.01.2020, 02:18

В коде две ошибки:

  1. При использовании [... ]для тестов разделите тесты на несколько [... ]логическими операторами в -между:

    while [ expression ] && [ expression ]; do
    

    Вы можете использовать свой способ построения теста, если используете bashи его[[... ]]:

    while [[ expression && expression ]]; do
    

    ... но, вероятно, он все равно будет более читабельным, если он будет разделен как

    while [[ expression ]] && [[ expression ]]; do
    

    по крайней мере, для более длинных или большего количества выражений. Только для арифметического теста -вы можете использовать ((... ))в bashи других оболочках, которые его поддерживают, например. (( arithmetic expression )) && (( arithmetic expression )). В ((... ))вы также должны использовать <, >и т. д. вместо -lt, -gtи т. д.

  2. Предполагая, что вы используете массивы bash, индекс в массиве оценивается в арифметическом контексте. Это означает, что ${a[$d]}можно записать как ${a[d]}. Что еще более важно, ${a[$(d-1)]}, вероятно, является ошибкой, поскольку он попытается запустить команду с именем d-1. Вероятно, это должно быть ${a[d - 1]}.

1
28.01.2020, 02:18

Поскольку этот синтаксис ksh (также поддерживается bashиzsh -o ksharrays)из-за тех массивов, индексы которых начинаются с 0 (, а не с 1 во всех других оболочках ), вы также можете использоватьksh((...))оператор арифметического вычисления здесь:

while ((d > 0 && a[d-1] > a[d]))

(другие уже объяснили проблемы в вашем коде ).

Обратите внимание, что zsh имеет встроенную поддержку численной сортировки массивов десятичных целых чисел:

$ a=(10 6 2)
$ echo ${(n)a}
2 6 10

ksh может сортировать массивы, но только лексически, насколько мне известно:

$ a=(10 2 6)
$ set -sA b -- "${a[@]}"
$ echo "${b[@]}"
10 2 6
1
28.01.2020, 02:18

Теги

Похожие вопросы