Pergunta básica de impressão de bash

0

Eu sei que essa pergunta é básica sabendo como escrever script, mas ainda não aprendi:

Eu tenho um programa que leva, como entrada, uma lista como: %código%. A string é sempre a mesma, mas os números vão de 1 a 1.000. Obviamente, não é possível escrever isso manualmente, então eu quero gerar o argumento str_1,str_2, etc automaticamente e então copiá-lo para o shell (ou, se houver uma maneira melhor de fazer, por favor me avise).

Como posso gerar essa lista?

    
por bigTree 06.03.2014 / 10:19

4 respostas

1
#!/usr/bin/python3

import os

def create_list(string_input):
    number = 0
    string_list = []
    while number <= 1000:
        number = number+1
        string_list.append(string_input+str(number))
    return(string_list)

command_list = create_list(string_input = "test")
for item in command_list:
    os.system("firefox -new-tab "+item)

Isso rodaria o firefox 1000 vezes, abrindo novas abas com "test1, test2" como url (não tente :))

altere "string_input" para sua string, "firefox -new-tab" para seu aplicativo.

edit: Eu devo ter tido um momento fraco, pode ser muito mais curto em python, claro:

#!/usr/bin/python3

import subprocess

command_list = [
    "firefox -new-tab "+"test"+str(number) for number in range(0,1001)
    ]
for command in command_list:
    subprocess.call(command)
    
por Jacob Vlijm 06.03.2014 / 11:00
1
# array=( str_1 str_2 str_3 ... str_1000 )
array=( str_{1..1000} )          

# prints the content of the array as a single string with comma between elements. 
# str_1,str_2,str_3,...,str_1000   
( IFS=,; printf '%s\n' "${array[*]}"; ) 

Veja o link para saber mais sobre como usar matrizes no bash.

    
por geirha 06.03.2014 / 11:11
1

Isso funcionará bem apenas no Bash:

array=( str_{1..1000} )
joined_array="$(printf '%s,' "${array[@]}")"
echo "${joined_array%,}"

A última linha echo é omitir a vírgula final.

A primeira linha dos comandos é de geirha 's responder .

    
por kiri 07.03.2014 / 23:41
0

Existem, como sempre, muitas soluções.

Pessoalmente, para uma coisa tão simples como esta, nem escrevo um script Python inteiro, nem declaro matrizes no bash ou altero o separador de campo interno.

Em vez disso, apenas escrevo algo assim, direto da linha de comando, em uma linha:

for i in {1..1000}; do printf str_$i,; done

Isso gerará uma string str_1,str_2,...,str_1000, . Dependendo do nível de automação de que você precisa, se você quiser retirar o , , então uma das possibilidades de um galho estimado é usar sed :

for i in {1..1000}; do printf str_$i,; done | sed 's/,$//;'

dando-lhe str_1,str_2,...,str_1000 .

Atualização:

Achei que, como você só quer fazer uma impressão, pode até mesmo fazer sem um loop explícito. Short & amp; batata frita:

echo str_{1..1000} | sed 's/ /,/g'

O último comando também lhe dá str_1,str_2,...,str_1000 .

Explicação: O echo str_{1..1000} outputs str_1 str_2 ... str_1000 . O sed 's/ /,/g' substitui todos os espaços em branco por vírgulas.

    
por Malte Skoruppa 06.03.2014 / 11:43