Я тоже нашел решение:
cat files.txt | while read f; do ls -la $f; done | awk '{s+=$5;} END {print s;}'
Вам нужно разделить эту test
команду (и указать ваши расширения, если вы используете POSIX -совместимую оболочку):
[ "$d" -gt 0 ] && [ "${a[d-1]}" -gt "${a[d]}" ]
В коде две ошибки:
При использовании [... ]
для тестов разделите тесты на несколько [... ]
логическими операторами в -между:
while [ expression ] && [ expression ]; do
Вы можете использовать свой способ построения теста, если используете bash
и его[[... ]]
:
while [[ expression && expression ]]; do
... но, вероятно, он все равно будет более читабельным, если он будет разделен как
while [[ expression ]] && [[ expression ]]; do
по крайней мере, для более длинных или большего количества выражений. Только для арифметического теста -вы можете использовать ((... ))
в bash
и других оболочках, которые его поддерживают, например. (( arithmetic expression )) && (( arithmetic expression ))
. В ((... ))
вы также должны использовать <
, >
и т. д. вместо -lt
, -gt
и т. д.
Предполагая, что вы используете массивы bash
, индекс в массиве оценивается в арифметическом контексте. Это означает, что ${a[$d]}
можно записать как ${a[d]}
. Что еще более важно, ${a[$(d-1)]}
, вероятно, является ошибкой, поскольку он попытается запустить команду с именем d-1
. Вероятно, это должно быть ${a[d - 1]}
.
Поскольку этот синтаксис 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