Como eu escrevo um script bash que permitirá aos usuários escolherem o valor da variável de ambiente MIRROR?

2

Eu estou atualmente no processo de escrever uma função Bash que, quando invocada, pedirá que os usuários escolham uma lista de espelhos do Sabayon, mas eu gostaria que cada opção incluísse informações sobre o espelho em questão, como seu país e velocidade de conexão. Atualmente eu tenho essa função Bash:

function sabayon-mirror {
  L=('ftp://mirrors.coopvgg.com.ar/sabayon/ 
  ftp://gd.tuwien.ac.at/linux/sabayonlinux/
  ftp://mirror.optusnet.com.au/sabayon')
  select x in "${L[@]}"
  do
    export MIRROR="$x"
  done
}

Adicionar as informações de espelho após cada URL faz com que as informações sejam tratadas como outra opção a ser selecionada.

EDIT: Resposta do Caos foi o que eu estava procurando originalmente, mas se você tem uma resposta que não me obriga a listar cada espelho manualmente (mas pode buscá-lo de uma lista remota) eu ainda gostaria de ouvir sobre isso.

    
por Brenton Horne 25.11.2015 / 12:37

2 respostas

3

Que tal isso:

function sabayon-mirror {
  L=('Info about mirror 1 - ftp://mirrors.coopvgg.com.ar/sabayon/' 
  'Info about mirror 2 - ftp://gd.tuwien.ac.at/linux/sabayonlinux/'
  'Info about mirror 3 - ftp://mirror.optusnet.com.au/sabayon')
  select x in "${L[@]}"
  do
    export MIRROR="${x#*-}"
  done
}

A informação faz parte do item. Mas, ao exportar o valor da variável, ele é removido.

    
por 25.11.2015 / 13:17
1

Você está definindo uma matriz com uma única entrada no seu script. Uma vez que você está citando todos os elementos, eles serão tratados como uma única string longa. Os elementos da matriz no bash são separados por espaços, portanto, é necessário citá-los separadamente:

L=('ftp://mirrors.coopvgg.com.ar/sabayon/' 
  'ftp://gd.tuwien.ac.at/linux/sabayonlinux/'
  'ftp://mirror.optusnet.com.au/sabayon')

Dito isto, uma vez que você está usando o bash, você pode usar matrizes associativas:

function sabayon-mirror {
  declare -A L=(
    [Info about mirror 1]="ftp://mirrors.coopvgg.com.ar/sabayon/"
    [Info about mirror 2]="ftp://gd.tuwien.ac.at/linux/sabayonlinux/"
    [Info about mirror 3]="ftp://mirror.optusnet.com.au/sabayon")
  select x in "${!L[@]}"
  do
    export MIRROR="${L[$x]}"
  done
}

Com isso em mente, eu peguei a lista de espelhos Sabayon de aqui e escrevi o função para você:

## Declare the associative array
declare -A L=(
[Argentina 1]="ftp://mirrors.coopvgg.com.ar/sabayon/entropy"              [Argentina 2]="http://mirrors.coopvgg.com.ar/sabayon/entropy"
[Austria 1]="ftp://gd.tuwien.ac.at/linux/sabayonlinux/entropy"            [Austria 2]="http://gd.tuwien.ac.at/linux/sabayonlinux/entropy"
[Australia 1]="ftp://mirror.internode.on.net/pub/sabayon/entropy"         [Australia 2]="http://mirror.internode.on.net/pub/sabayon/entropy"
[Australia 3]="ftp://mirror.optusnet.com.au/sabayon/entropy"              [Australia 4]="http://mirror.optusnet.com.au/sabayon/entropy"
[Belgium 1]="ftp://ftp.belnet.be/mirror/sabayonlinux/entropy"             [Belgium 2]="http://ftp.belnet.be/mirror/sabayonlinux/entropy"
[Brazil 1]="ftp://sabayon.c3sl.ufpr.br/sabayon/entropy"                   [Brazil 2]="http://sabayon.c3sl.ufpr.br/entropy"
[Czech Republic 1]="ftp://mirror.dkm.cz/pub/sabayon/entropy"              [Czech Republic 2]="http://sabayon.mirror.dkm.cz/pub/sabayon/entropy"
[Germany 1]="http://mirror.de.sabayon.org/entropy"                        [Denmark 1]="ftp://ftp.klid.dk/sabayonlinux/enttropy"
[Denmark 2]="http://ftp.klid.dk/sabayonlinux/entropy"                     [Greece 1]="ftp://ftp.cc.uoc.gr/mirrors/linux/SabayonLinux/entropy"
[Greece 2]="http://ftp.cc.uoc.gr/mirrors/linux/SabayonLinux/entropy"      [Hungary 1]="ftp://ftp.fsn.hu/pub/linux/distributions/sabayon/entropy"
[Hungary 2]="http://ftp.fsn.hu/pub/linux/distributions/sabayon/entropy"   [Italy 1]="http://mirror.it.sabayon.org/entropy"
[Italy 2]="ftp://na.mirror.garr.it/mirrors/sabayonlinux/entropy"          [Italy 3]="http://na.mirror.garr.it/mirrors/sabayonlinux/entropy"
[Japan 1]="ftp://ftp.riken.jp/Linux/sabayon/entropy"                      [Japan 2]="http://ftp.riken.jp/Linux/sabayon/entropy"
[Japan 3]="ftp://ftp.kddilabs.jp/Linux/packages/sabayonlinux/entropy"     [Japan 4]="http://ftp.kddilabs.jp/Linux/packages/sabayonlinux/entropy"
[Japan 5]="http://ftp.tsukuba.wide.ad.jp/Linux/sabayon/entropy"           [Netherlands 1]="ftp://ftp.nluug.nl/pub/os/Linux/distr/sabayonlinux/entropy"
[Netherlands 2]="http://ftp.nluug.nl/os/Linux/distr/sabayonlinux/entropy" [Netherlands 3]="ftp://ftp.surfnet.nl/pub/os/Linux/distr/sabayonlinux/entropy"
[Portugal 1]="ftp://glua.ua.pt/sabayon/entropy"                           [Portugal 2]="ftp://ftp.rnl.ist.utl.pt/pub/sabayon/entropy"
[Portugal 3]="http://ftp.rnl.ist.utl.pt/pub/sabayon/entropy"              [Russian Federation 1]="ftp://mirror.yandex.ru/sabayon/entropy"
[Russian Federation 2]="http://mirror.yandex.ru/sabayon/entropy"          [Sweden 1]="ftp://ftp.portlane.com/pub/os/linux/sabayon/entropy"
[Sweden 2]="http://ftp.portlane.com/pub/os/linux/sabayon/entropy"         [United States 1]="ftp://mirrors-usa.go-parts.com/sabayon/entropy"
[United States 2]="http://mirrors-usa.go-parts.com/sabayon/entropy"       [United States 3]="ftp://mirror.cs.vt.edu/pub/SabayonLinux/entropy"
[United States 4]="http://mirror.cs.vt.edu/pub/SabayonLinux/entropy"      [United States 5]="http://cross-lfs.sabayonlinux.org/entropy"
[United States 6]="http://mirror.clarkson.edu/sabayon/entropy"            [United States 7]="http://mirror.umd.edu/sabayonlinux/entropy"
[South Africa 1]="ftp://sabayon.mirror.ac.za/entropy"                     [South Africa 2]="http://sabayon.mirror.ac.za/entropy"
)
## Unfortunately, associative arrays are not stored in the
## order you create them with so, to have the select show
## sorted options, we need a second, helper array.
sorted=(
[1]="Argentina 1"             [2]="Argentina 2"             [3]="Australia 1"
[4]="Australia 2"             [5]="Australia 3"             [6]="Australia 4"
[7]="Austria 1"               [8]="Austria 2"               [9]="Belgium 1"
[10]="Belgium 2"              [11]="Brazil 1"               [12]="Brazil 2"
[13]="Czech Republic 1"       [14]="Czech Republic 2"       [15]="Denmark 1"
[16]="Denmark 2"              [17]="Germany 1"              [18]="Greece 1"
[19]="Greece 2"               [20]="Hungary 1"              [21]="Hungary 2"
[22]="Italy 1"                [23]="Italy 2"                [24]="Italy 3"
[25]="Japan 1"                [26]="Japan 2"                [27]="Japan 3"
[28]="Japan 4"                [29]="Japan 5"                [30]="Netherlands 1"
[31]="Netherlands 2"          [32]="Netherlands 3"          [33]="Portugal 1"
[34]="Portugal 2"             [35]="Portugal 3"             [36]="Russian Federation 1"
[37]="Russian Federation 2"   [38]="South Africa 1"         [39]="South Africa 2"
[40]="Sweden 1"               [41]="Sweden 2"               [42]="United States 1"
[43]="United States 2"        [44]="United States 3"        [45]="United States 4"
[46]="United States 5"        [47]="United States 6"        [48]="United States 7"
)
select x in "${sorted[@]}"
do
    export MIRROR="${L[$x]}"
    break
done

Deve haver uma maneira melhor de fazer isso, tenho certeza que os espelhos disponíveis estão armazenados em algum lugar no seu sistema Sabayon, mas eu não uso o Sabayon, então não sei. De acordo com a página que eu criei acima, eles provavelmente estão armazenados em /etc/entropy/repositories.conf.d . Se você editar sua pergunta com o formato desse diretório, poderemos ajudá-lo a gerar a lista de espelhamento em tempo real.

    
por 25.11.2015 / 15:27