Использование исходной команды для замены строки bash массивом полей

Я программировал на других языках, но bash и unix в целом очень новы для меня. Я думаю, что мастер bash может увидеть очевидное решение, используя исходную команду для чтения в файле настроек и присвоения значений моей командной строке?

В идеале я хотел бы создать командную строку из всех полей / значения параметров в файле, заменяя их совпадения в строке.

Мой файл будет выглядеть примерно так:

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

Так что, если я использовал команду:

source settings.cfg

Там будет переменная с именем $stream_bitrate, которая будет иметь значение «128k».

Затем я мог бы использовать строковую замену в stream_parameters= <stream_bitrate>, чтобы это выглядело как stream_parameters= 128k

Но мне интересно, может ли bash-гуру увидеть простой цикл на основе индекса - или регулярное выражение, которое может сделать работа для любых параметров загружается.

Я могу изменить свой файл настроек, чтобы облегчить его при необходимости. Я поместил «<>» вокруг местоположения параметров замены - но они могут быть удалены или изменены при необходимости.

И это может быть одна строка командной строки, если это необходимо.

РЕДАКТИРОВАТЬ: Переместить обработку командной строки во второй файл

Будет ли это работать?

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"
1
задан 3 July 2016 в 15:31

1 ответ

Сценарий в Вашем редактировании должен работать отлично.

, Но необходимо отметить, что объявление переменной Bash придирчиво. Я переписал Ваш код:

# 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"

Что касается того, как выполнить команду, определенную строкой, это супер просто. Просто выполнение это: $stream_cmd

Также Вы могли бы хотеть заявить полный путь файла конфигурации (возможно ~/settings.cfg), если Вы не хотите использовать относительное местоположение.

0
ответ дан 3 July 2016 в 15:31
  • 1
    Я только что проверил его еще раз, и сценарию не удается удалить те строки каждый раз, когда после дефиса только элемент из второго списка появляется. Когда я использую эти примеры от вопроса, он работает правильно, но когда я включаю [еще 110] elements в file2, ему не удается обработать. size из файла может быть проблема? Мой file2 имеет [приблизительно 115] и file1 имеют [приблизительно 117].. – djordje 29 January 2018 в 23:16

Другие вопросы по тегам:

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