Usando o comando source para substituir a string bash pela matriz de campo

1

Eu programei em outras linguagens, mas o bash e o unix em geral são muito novos para mim. Eu acho que um assistente bash pode ver uma solução óbvia, usando o comando source para ler em um arquivo de configurações - e atribuir valores à minha cadeia de comando?

Idealmente, gostaria de criar uma string de comando a partir de todas as configurações de campo / valor em um arquivo, substituindo suas correspondências em uma string.

Meu arquivo será parecido com:

settings.cfg

#!/bin/bash
#
# WiFi Settings
#
wifi_name=mywifiname
wifi_password=wifi-pwd
#
# Icecast Server Settings
#
icecast_server=icecast.domain.com
icecast_port=443
icecast_mount_url=/user/99999/show/0123456
icecast_show=RPi Demo Show
icecast_user=
icecast_password=icecast-pwd
#
# avconv setting for Raspbian Jessie Lite
# may not need if you're using a self compiled ffmpeg version
#
icecast_legacy=1
#
# Stream Settings - probably not safer to go higher unless great internet connection
#
stream_bitrate=128k

Então, se eu usei o comando:

source settings.cfg

Haveria uma variável chamada $stream_bitrate que teria o valor "128k".

Eu poderia usar uma string substitua em stream_parameters= <stream_bitrate> para fazer com que pareça com stream_parameters= 128k

Mas eu estou querendo saber se os gurus do bash podem ver um laço baseado em índice simples - ou expressão regular que pode fazer o trabalho para quaisquer parâmetros que forem carregados.

Posso alterar meu arquivo de configurações para facilitar, se necessário. Eu coloquei "< >" em torno dos locais dos parâmetros de substituição - mas esses podem ser removidos ou modificados, se necessário.

E pode ser uma cadeia de linha de comando, se necessário.

EDIT: Move command line processing to second file

Isso funcionaria?

ProcessSettings.sh

#!/bin/bash
#
# Load in config file settings
source settings.cfg

# build command line string
start_cmd=avconv -re -i test.mp3 -c:a libmp3lame -ac 2 -ar 44100 -content_type audio/mpeg -b:a
stream_parameters="$stream_bitrate -f mp3 -ice_name "$icecast_show" -password "icecast_password" -legacy_icecast $icecast_legacy"
icecast_setup=icecast://$icecast_user:$icecast_password@$icecast_server:$icecast_port$icecast_mount_url

stream_cmd = "$start_cmd $stream_parameters $icecast_setup"
    
por dbmitch 03.07.2016 / 03:17

1 resposta

1

O script na sua edição deve funcionar perfeitamente.

Mas você deve notar que a declaração de variáveis do Bash é exigente. Eu reescrevi seu código:

# Strings with spaces must be quoted, or the shell will think the second word is a command (-re, in this case).
start_cmd="avconv -re -i test.mp3 -c:a libmp3lame -ac 2 -ar 44100 -content_type audio/mpeg -b:a"

# You can't nest quotes. A quote mark terminates the quotation, unless it's escaped.
stream_parameters="$stream_bitrate -f mp3 -ice_name $icecast_show -password $icecast_password -legacy_icecast $icecast_legacy" 

# It's best to quote strings, as a habit.
icecast_setup="icecast://$icecast_user:$icecast_password@$icecast_server:$icecast_port$icecast_mount_url"

# Don't put spaces around the equals sign.
stream_cmd="$start_cmd $stream_parameters $icecast_setup"

Quanto a como executar um comando definido por uma string, é super simples. Basta executar isto: $stream_cmd

Você também pode indicar o caminho absoluto do arquivo de configuração (talvez ~/settings.cfg ), a menos que queira usar o local relativo.

    
por wjandrea 03.07.2016 / 05:00