当 运行 命令带有嵌入引号(源参数)时,Bash 脚本失败
Bash script fails when running command with embedded quotes (source parameters)
我正在使用 source
将生成的变量插入文件中的字符串,以便从 bash 脚本中执行该字符串。
我已经回显了生成的字符串以与命令行中的字符串进行比较,我似乎看不出有什么不同,但是 bash 命令失败了,因为似乎提供的参数正在获取在中间的某个地方混淆了。
我在 ice_name 字符串周围转义了双引号,因此它看起来与我回显它时有效的那个相同
是否需要转义其他字符?
-ice_name
参数
之前似乎弄混了
这是命令
avconv -re -i test.mp3 -c:a libmp3lame -content_type audio/mpeg -b:a 128k -legacy_icecast 1
-ice_name "Raspi Test Stream of MP3" -f mp3
icecast://:mypwd@icecast.servername.com/my/mount/point/url
不确定您是否需要 beng 源文件,但以防万一这里是
#!/bin/bash
#
# stream.cfg
#
# WiFi Settings
#
wifi_name=mywifi
wifi_password=mywifipwd
#
# Icecast Server Settings
#
icecast_server=icecast.server.com
icecast_port=443
icecast_mount_url=/user/mountpt/url
icecast_show="RPi Demo Show - autostart"
icecast_description="Test of Stream from RPi USB Audio to Spreaker"
icecast_user=""
# Source password
icecast_password=sourcepwd
#
# 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
处理配置文件并生成流命令的脚本
#!/bin/bash
#
# autostart-settings.sh
#
# Load in config file settings
CONFIG_FILE=~/autostart/autostart-settings.cfg
# Check if file exists
echo "does file exist"
if [ ! -f "$CONFIG_FILE" ]; then
echo "Config File: $(CONFIG_FILE) does not exist"
exit 1
else
# process settings
echo "running source on $CONFIG_FILE"
source "$CONFIG_FILE"
fi
start_cmd="avconv -re -i /home/pi/test.mp3 -c:a libmp3lame -content_type audio/mpeg -b:a $stream_bitrate -legacy_icecast $icecast_legacy"
stream_parameters="-ice_name \"$icecast_show\" -f mp3"
icecast_setup="icecast://$icecast_user:$icecast_password@$icecast_server:$icecast_port$icecast_mount_url"
test_cmd="$start_cmd $stream_parameters $icecast_setup"
echo "Testing command: $test_cmd"
# Run command
$test_cmd
在字符串中嵌入引号不会转义换行字符;它们只是值中的文字字符。您需要为此使用数组:
cmd=avconv
args=(-re -i /home/pi/test.mp3 -c:a libmp3lame -content_type audio/mpeg -b:a "$stream_bitrate" -legacy_icecast "$icecast_legacy")
stream_parameters=(-ice_name "$icecast_show" -f mp3)
icecast_setup="icecast://$icecast_user:$icecast_password@$icecast_server:$icecast_port$icecast_mount_url"
test_cmd="$start_cmd $stream_parameters $icecast_setup"
echo "Testing command: $cmd ${args} ${stream_parameters[@]} $icecast_setup"
# Run command
"$cmd" "${args[@]}" "${stream_parameters[@]}" "$icecast_setup"
我正在使用 source
将生成的变量插入文件中的字符串,以便从 bash 脚本中执行该字符串。
我已经回显了生成的字符串以与命令行中的字符串进行比较,我似乎看不出有什么不同,但是 bash 命令失败了,因为似乎提供的参数正在获取在中间的某个地方混淆了。
我在 ice_name 字符串周围转义了双引号,因此它看起来与我回显它时有效的那个相同
是否需要转义其他字符?
-ice_name
参数
这是命令
avconv -re -i test.mp3 -c:a libmp3lame -content_type audio/mpeg -b:a 128k -legacy_icecast 1
-ice_name "Raspi Test Stream of MP3" -f mp3
icecast://:mypwd@icecast.servername.com/my/mount/point/url
不确定您是否需要 beng 源文件,但以防万一这里是
#!/bin/bash
#
# stream.cfg
#
# WiFi Settings
#
wifi_name=mywifi
wifi_password=mywifipwd
#
# Icecast Server Settings
#
icecast_server=icecast.server.com
icecast_port=443
icecast_mount_url=/user/mountpt/url
icecast_show="RPi Demo Show - autostart"
icecast_description="Test of Stream from RPi USB Audio to Spreaker"
icecast_user=""
# Source password
icecast_password=sourcepwd
#
# 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
处理配置文件并生成流命令的脚本
#!/bin/bash
#
# autostart-settings.sh
#
# Load in config file settings
CONFIG_FILE=~/autostart/autostart-settings.cfg
# Check if file exists
echo "does file exist"
if [ ! -f "$CONFIG_FILE" ]; then
echo "Config File: $(CONFIG_FILE) does not exist"
exit 1
else
# process settings
echo "running source on $CONFIG_FILE"
source "$CONFIG_FILE"
fi
start_cmd="avconv -re -i /home/pi/test.mp3 -c:a libmp3lame -content_type audio/mpeg -b:a $stream_bitrate -legacy_icecast $icecast_legacy"
stream_parameters="-ice_name \"$icecast_show\" -f mp3"
icecast_setup="icecast://$icecast_user:$icecast_password@$icecast_server:$icecast_port$icecast_mount_url"
test_cmd="$start_cmd $stream_parameters $icecast_setup"
echo "Testing command: $test_cmd"
# Run command
$test_cmd
在字符串中嵌入引号不会转义换行字符;它们只是值中的文字字符。您需要为此使用数组:
cmd=avconv
args=(-re -i /home/pi/test.mp3 -c:a libmp3lame -content_type audio/mpeg -b:a "$stream_bitrate" -legacy_icecast "$icecast_legacy")
stream_parameters=(-ice_name "$icecast_show" -f mp3)
icecast_setup="icecast://$icecast_user:$icecast_password@$icecast_server:$icecast_port$icecast_mount_url"
test_cmd="$start_cmd $stream_parameters $icecast_setup"
echo "Testing command: $cmd ${args} ${stream_parameters[@]} $icecast_setup"
# Run command
"$cmd" "${args[@]}" "${stream_parameters[@]}" "$icecast_setup"