Execute um comando usando argumentos que vêm de uma matriz

3

Suponha que eu tenha um programa gráfico chamado app . Exemplo de uso: app -t 'first tab' -t 'second tab' abre duas "guias" nesse programa.

A pergunta é: como posso executar o comando (por exemplo, app ) dentro de um script bash se o número de argumentos puder variar?

Considere isso:

#!/bin/bash
tabs=(
    'first tab'
    'second tab'
)

# Open the app (starting with some tabs).
app  # ... How to get 'app -t 'first tab' -t 'second tab''?

Eu gostaria que o script acima tivesse um efeito equivalente a app -t 'first tab' -t 'second tab' . Como esse script bash pode ser escrito?

Editar: observe que a pergunta é sobre a composição de argumentos de linha de comando em tempo real usando uma matriz de argumentos.

    
por Flux 23.12.2017 / 09:25

4 respostas

5

Dar os argumentos de uma matriz é fácil, "${array[@]}" se expande para as entradas da matriz como palavras distintas (argumentos). Nós só precisamos adicionar os -t flags. Para fazer isso, podemos fazer o loop da primeira matriz e construir outra matriz para a lista completa de argumentos, adicionando as -t flags à medida que avançamos:

#!/bin/bash
tabs=("first tab" "second tab")
args=()
for t in "${tabs[@]}" ; do 
    args+=(-t "$t")
done
app "${args[@]}"

Use "$@" em vez de "${tabs[@]}" para obter os argumentos da linha de comando do script em vez de uma lista codificada.

    
por 23.12.2017 / 10:15
3
tabs=("-t" "one tab" "-t" "second tab")
echo app "${tabs[@]}"
app -t one tab -t second tab

Então, agora você deve converter sua matriz original em array com sinalizadores "-t". Espero que não seja um problema.

    
por 23.12.2017 / 10:02
0

É mais fácil com zsh :

#!/bin/zsh -
tabs=(
    'first tab'
    'second tab'
)

app -t$^tabs

Chama app como se você tivesse digitado:

app -t'first tab' -t'second tab'

rc , es e fish fazem isso implicitamente ( $^array do zsh é realmente inspirado em rc ' ^ ):

Nestas conchas,

app -t$tabs

também faria isso.

Para chamar app como se estivesse com

app -t 'first tab' -t 'second tab'

ao contrário de

app -t'first tab' -t'second tab'

É aí que -t e first tab são dois argumentos diferentes para app , com zsh :

app ${${:--t}:^^tabs}

usando o operador ${array1:^^array2} array-zipping , onde ${:--t} (forma mínima de ${var:-default} ) é usado para inline na primeira matriz.

    
por 23.12.2017 / 23:56
-1

Basicamente, o seguinte script bash lerá o arquivo que inclui sites linha por linha e abrirá cada site em uma nova guia.

#!/bin/bash
while read line
do 
    xdg-open "$line"
done < /root/file

Usage

./script.sh sites

    
por 23.12.2017 / 09:28

Tags