Bash脚本 - 使用转义变量将命令管道输入另一个

时间:2016-07-08 21:42:43

标签: bash shell sh

在@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是否需要调整?

另外 - 最后一个命令中[@]的含义是什么 - 只是扩展数组?

1 个答案:

答案 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 bc d,因为数组扩展会生成两个单词。另一方面,

$ printf "%s\n" "${a[*]}"

生成一行输出行a b c d,因为数组的元素连接成一个单词,用空格分隔。和

$ printf "%s\n" ${a[@]}

打印四行输出行abcd,因为扩展中的所有空格都用于将扩展分成单个词。 (${a[*]}具有相同的效果;如果未引用扩展,则使用*@的字符无关紧要。)