在@chepner中扩展问题答案 Bash script fails when running command with embedded quotes (source parameters)
如果我想将另一个命令输入其中,我是否必须对$ cmd变量执行任何特殊操作?以前它已被拆分为args数组以处理转义引号。
即。管道符号和添加额外命令是否也需要特殊处理?
我想更改第一行:
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"
对此:
cmd="arecord -f cd -D plughw:1,0 | avconv"
这仍然可以在最后一行吗?或者$ cmd和$ args是否需要调整?
另外 - 最后一个命令中[@]
的含义是什么 - 只是扩展数组?
答案 0 :(得分:3)
这不起作用;管道将被视为arecord
命令的另一个参数,而不是将record
连接到avconv
的管道。此时,您要定义一个shell函数:
my_cmd () {
arecord -f cd -D plughw:1,0 | avconv "$@"
}
my_cmd "${args[@]}" "${stream_parameters[@]}" "$icecast_setup"
赋予my_cmd
的参数用作函数内avconv
的参数。
[@]
将数组扩展到其每个元素。具体而言,@
具有特殊含义:每个元素都被视为引用的单词。例如,
$ a=("a b" "c d")
$ printf "%s\n" "${a[@]}"
打印两行输出a b
和c d
,因为数组扩展会生成两个单词。另一方面,
$ printf "%s\n" "${a[*]}"
生成一行输出行a b c d
,因为数组的元素连接成一个单词,用空格分隔。和
$ printf "%s\n" ${a[@]}
打印四行输出行a
,b
,c
和d
,因为扩展中的所有空格都用于将扩展分成单个词。 (${a[*]}
具有相同的效果;如果未引用扩展,则使用*
或@
的字符无关紧要。)