Переменная присвоения Bash In For Lop Returns «Команда не найдена»

Что мешает du вывести размер вложенных папок, так это аргумент -s (сокращение от - суммировать ) , что заставит du выводить только размер своих аргументов и не включать вложенные папки.

Попробуйте вместо этого du -hc / .

0
08.12.2018, 06:20
2 ответа

По-видимому, 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имеет аналогичный эффект с добавлением возможности экспорта переменной в подпроцессы, что является его основной функцией.

2
28.01.2020, 02:18

Ваши сценарии, текущие и будущие, были бы лучше, если бы вы использовали для этого массив:

#!/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 — это строка со знаком равенства. Оболочка попытается выполнить эту строку, как если бы это было имя команды.

2
28.01.2020, 02:18

Теги

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