Что мешает du
вывести размер вложенных папок, так это аргумент -s
(сокращение от - суммировать
) , что заставит du
выводить только размер своих аргументов и не включать вложенные папки.
Попробуйте вместо этого du -hc /
.
По-видимому, bash
уделяет особое внимание интерпретации командной строки, где она обнаруживает назначения переменных перед оценкой используемых переменных. В основном присваивание переменной требует, чтобы часть имени была именем собственным, а не полученным в результате оценки. Но есть понятие «nameref», когда переменная имеет имя переменной в качестве значения, а затем присвоение ей вместо этого становится присвоением переменной, названной по ее значению. В вашем примере это будет выглядеть примерно так:
for ID_COUNT in 1 2 3; do
declare -n X=ID${ID_COUNT}
X=ID${ID_COUNT}_VALUE;
done;
То же самое, конечно, достигается с помощью команды eval
, которая оценивает свои аргументы как команду в контексте своего вызова. Использование этого будет выглядеть следующим образом:
for ID_COUNT in 1 2 3; do
eval ID${ID_COUNT}=ID${ID_COUNT}_VALUE;
done;
Как уже отмечалось, использование export
имеет аналогичный эффект с добавлением возможности экспорта переменной в подпроцессы, что является его основной функцией.
Ваши сценарии, текущие и будущие, были бы лучше, если бы вы использовали для этого массив:
#!/bin/bash
for i in 1 2 3; do
id[i]="ID${i}_VALUE"
done
echo 'contents of the array "id":'
printf '\t%s\n' "${id[@]}"
Вывод этого скрипта будет
contents of the array "id":
ID1_VALUE
ID2_VALUE
ID3_VALUE
Цикл в скрипте также можно заменить на
id=( "ID"{1..3}"_VALUE" )
, который использует раскрытие фигурных скобок для создания массива.
Что происходит в вашем коде, так это то, что переменная $ID_COUNT
в ID${ID_COUNT}=ID${ID_COUNT}_VALUE;
расширяется, давая ID2=ID2_VALUE
, если ее значение равно 2. Однако в этот момент при выполнении команды переменные уже были обнаружены, так что вы have now — это строка со знаком равенства. Оболочка попытается выполнить эту строку, как если бы это было имя команды.