Код, который вы опубликовали, не может создать вывод, который вы опубликовалиОчевидно, что об ошибке сообщается в строке 11, но вы разместили менее 11 строк кода.Предыдущие строки могут иметь значение.Всегда отправляйте полный код , когда вы просите о помощи.
Более конкретно, команда declare
не существует в ksh, это вещь bash.Вы можете достичь того же результата с помощью typeset
(declare
- это bash, эквивалентный typeset
, но не все опции одинаковы).Либо вы выполняете этот скрипт с bash, либо есть другое сообщение об ошибке declare
, либо вы определили некоторые дополнительные команды, включая declare
, которые могут изменить поведение этого кода.
Ничего из этогооднако, это должно повлиять на конкретную проблему, о которой вы пишете.Переменные, созданные с помощью read
, остаются назначенными до конца подоболочки, то есть до тех пор, пока код не достигнет )
, конца канала (левая часть канала только в ksh) и т. Д.
Что касается использования declare
или typeset
, обратите внимание, что вы объявляете только TOTAL_SIZE
как целое число.Для других переменных вы просто присваиваете значение, которое состоит исключительно из цифр.Это не имеет значения для кода, который вы разместили, но, вероятно, это не то, что вы имели в виду.
Одна вещь, которая может происходить, это то, что grep
ничего не соответствует, и поэтому read
читает пустую строку.Вы должны проверить на ошибки.Используйте set -e
в скриптах для выхода при первой ошибке.(Есть случаи, когда set -e
не перехватывает ошибки, но это хорошее начало.)
Еще одна вещь, которая может произойти, это то, что df
разбивает свой вывод на несколько строк, потому что первый столбец, содержащийимя файловой системы слишком велико.Чтобы предотвратить это разделение, передайте опцию -P
.
Использование временного файла хрупко: код может выполняться в каталоге только для чтения, другой процесс может захотеть получить доступ к тому же файлу одновременно... Здесь временный файл бесполезен.Просто направьте трубку прямо в read
.В ksh (в отличие от большинства других вариантов sh, включая bash), правая часть трубы проходит в основной оболочке, поэтому назначения переменных в правой части трубы остаются доступными в следующих командах.
Это не имеет значения в этом конкретном скрипте, но вы можете использовать переменную без $
в арифметическом выражении.Использование $
заменяет строку, которая может привести к сбивающим с толку результатам, например, a='1+2'; $((a*3))
расширяется до 7
.Если не использовать $
, используется числовое значение (в ksh a='1+2'; $((a*3))
расширяется до 9
; в некоторых реализациях sh вы получаете ошибку, поскольку значение a
не является числовым).
#!/usr/bin/ksh
set -e
typeset -i TOTAL_SIZE=0 USED_SPACE=0 AVAILABLE_SPACE=0 AVAILABLE_PERCENT=0
df -Pk | grep "rpool/ROOT" | read RPOOL_NAME TOTAL_SIZE USED_SPACE AVAILABLE_SPACE AVAILABLE_PERCENT RSIGN
echo $RPOOL_NAME $TOTAL_SIZE $USED_SPACE $AVAILABLE_SPACE $AVAILABLE_PERCENT $RSIGN
((TOTAL_SIZE=TOTAL_SIZE/1024))