使用 source 命令用字段数组替换 bash 字符串

使用 source 命令用字段数组替换 bash 字符串

我曾经用其他语言编程,但 bash 和 unix 对我来说很新。我认为 bash 向导可能会看到一个明显的解决方案,使用 source 命令读取设置文件 - 并为我的命令字符串赋值?

理想情况下,我希望通过在字符串中替换它们的匹配项,从文件中的所有字段/值设置中创建命令字符串。

我的文件看起来会像这样:

设置配置文件

#!/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 专家是否可以看到一个简单的基于索引的循环 - 或者正则表达式,它可以完成任何加载的参数的工作。

如果需要,我可以更改设置文件以使其更简单。我在替换参数位置周围放置了“<>” - 但如果需要,可以删除或修改它们。

如果需要,它可以是一个命令行字符串。

编辑:将命令行处理移至第二个文件

这有用吗?

进程设置.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

您编辑的脚本应该可以完美运行。

但你应该注意到 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),除非您想使用相对位置。

相关内容