Bash скрипт выполняет команду оболочки с переменной Bash в качестве аргумента - PullRequest
1 голос
/ 30 июля 2011

У меня есть один цикл, который создает группу переменных, таких как DISK1, DISK2 ... где число в конце имени переменной создается циклом, а затем загружается с путем к имени устройства. Теперь я хочу использовать эти переменные в другом цикле для выполнения команды оболочки, но переменная не передает свое содержимое команде оболочки.

for (( counter=1 ; counter<=devcount ; counter++))
do
    TEMP="\$DISK$counter"

# $TEMP should hold the variable name of the disk, which holds the device name
# TEMP was only for testing, but still has same problem as $DISK$counter

    eval echo $TEMP  #This echos correctly

    STATD$counter=$(eval "smartctl -H -l error \$DISK$counter" | grep -v "5.41" | grep -v "Joe")
    eval echo \$STATD$counter

done

1 Ответ

2 голосов
/ 30 июля 2011

Никогда не используйте eval, за исключением, может быть, если нет другого пути И вы действительно знаете, что делаете.

STATD$counter=$(...) должно выдавать ошибку. Это недопустимое назначение, потому что строка "STATD$counter" не является допустимым именем переменной. Что произойдет (на конкретном примере, если счетчик оказался равным 3 и ваш конвейер в выводе $( ) «output»), bash расширит эту строку только до «STATD3=output», поэтому попытается найти команду с именем "STATD3=output" и запустите ее. Скорее всего, это не то, что вы хотели.

Звучит так, будто все, что вы хотите сделать, может быть достигнуто с помощью массивов. Если вы не знакомы с массивами bash, посмотрите Wiki Грега , в частности эту страницу или страницу руководства bash, чтобы узнать, как их использовать.

Например, в цикле, который вы не опубликовали в своем вопросе: сделайте disk (не DISK: не используйте все имена переменных в верхнем регистре ) массив, подобный

disk+=( "new value" )

или даже

disk[counter]="new value"

Затем в цикле в вашем вопросе вы также можете сделать statd массивом и присвоить ему значения с диска на

statd[counter]="... ${disk[counter]} ..."

Стоит повторить: избегайте использования eval.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...