Bash - Как получить доступ к переменной с числовым суффиксом с помощью цикла FOR [дубликат]

После удаления kde-full,

apt autoremove

или

apt-get autoremove

(apt autoremove будет доступно в Debian 9)

должен удалить все пакеты, которые были установлены автоматически вместе с kde-full. Позаботьтесь о том, чтобы просмотреть список пакетов, которые будут удалены, прежде чем подтверждать удаление.

Другие пакеты могут быть помечены как не, устанавливаемые автоматически, , например. kdeartwork в вашем случае (по какой-то причине). Вам нужно удалить эти пакеты и повторно запустить autoremove. Чтобы определить все пакеты, которые необходимо удалить, найдите пакеты с автоматическим флагом или запустите aptitude Why для пакетов, которые устанавливаются автоматически, и найдите пакеты без A на выходе. После нескольких итераций вам удастся избавиться от всех нежелательных пакетов.

0
16.09.2018, 19:57
2 ответа

Дано,

var0=a
var1=b
var2=c

с ksh93 или bash 4.3 или новее вы можете использовать nameref для указания на отдельные переменные:

for i in 0 1 2; do
    typeset -n p="var$i"
    echo "$p"
done

Но если вам явно не нужны переменные как отдельные скаляры (, например, потому что вы передавали их через среду )и используете не строго стандартную оболочку, а Bash или ksh, вы должны вместо этого использовать массив:

#!/bin/bash
a=(a b c)
for i in 0 1 2; do
    echo "${a[i]}"
done

Или игнорирование индексов:

for x in "${a[@]}"; do
    echo "$x"
done

(В Zsh, конечно, тоже есть массивы, он просто начинает индексацию с 1 по умолчанию, так что первый не работает напрямую.)

5
28.01.2020, 02:13

Для этого можно использовать eval:

$ var1='< 1 >'; var2='< 2 >'; var3='< 3 >'
$ for i in 1 2 3; do eval echo \$var$i; done
$ for i in 1 2 3; do eval "echo \$var$i"; done
$ for i in 1 2 3; do eval 'echo $var'$i; done
$ for i in 1 2 3; do eval "v=\$var$i"; echo "$v"; done

Будьте осторожны с цитированием и экранированием. Если значения содержат пробелы или подстановочные символы, первые три будут разделять значения по пробелам, а затем расширять любые имена файлов, соответствующие подстановочным знакам. Это может быть или не быть тем, что вы хотите. Например:

$ var1='<  x  >' var2='< * >'
$ for i in 1 2; do eval echo \$var$i; done
< x >
< [list of filenames in current directory] >

(Обратите внимание, что двойные пробелы вокруг xбыли свернуты в одиночные пробелы, поскольку echoполучил <, xи >в качестве отдельных аргументов.)

Чтобы обойти это, вам нужно убедиться, что расширение переменной заключено в кавычки в eval, например.:

$ for i in 1 2; do eval echo \"\$var"$i"\"; done
<  x  >
< * >

(также укажите $i, как указано выше, если только вы не знаете, что IFSне содержит цифр.)

4
28.01.2020, 02:13

Теги

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