如何将必须用引号引起来的值传递给命令?

如何将必须用引号引起来的值传递给命令?

我正在尝试制作一个使用 ffmpeg 录制屏幕和音频的脚本。用户将能够选择录制内容:仅屏幕、仅麦克风、仅扬声器声音或这些的组合。

我正在努力进行录音工作。我最初尝试使用 Alsa,但在录制时我什么也听不到。然后我尝试使用Pulseaudio,但结果很糟糕。现在我尝试使用OpenAL,结果非常好。但是,它的选项有空格,我无法使脚本可靠地工作:

OpenAL 选项有:

[openal @ 0x55c6aa3b77a0] List of OpenAL capture devices on this system:
[openal @ 0x55c6aa3b77a0]   Áudio interno Estéreo analógico
[openal @ 0x55c6aa3b77a0]   Monitor of Áudio interno Estéreo analógico

根据用户选项和屏幕尺寸,命令行具有不同的变量,包括:

env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough \
-vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi \
${monitorsom} "${openal}" ${micro} "${microal}" ${complexo}   \
-thread_queue_size 4096 -framerate 30  \
-f x11grab -s "$(xdpyinfo  | grep -oP 'dimensions:\s+\K\S+')" -i :0.0  \
-acodec libfdk_aac -b:a 192k \
-vf 'format=nv12,hwupload' -vcodec h264_vaapi \
-f flv "${nome}"

这种方法的一个大问题是变量监控索姆,开放的,,微量元素复杂的可以为空。没有问题监控索姆,复杂的,结果命令很好。然而,如果开放的或者微量元素为空,则 ffmpeg 命令失败。如果未选择任何选项(没有声音),则传递的命令为:

 env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough -vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi '' '' -thread_queue_size 4096 -framerate 30 -f x11grab -s 1366x768 -i :0.0 -acodec libfdk_aac -b:a 192k -vf format=nv12,hwupload -vcodec h264_vaapi -f flv TEST002.flv

它具有在有选项时必须使用的引号,但由于它们为空,因此命令失败。

如果我尝试不同的方法,将变量部分更改为(不带任何引号):

${monitorsom} ${openal} ${micro} ${microal} ${complexo}   \

当它们为空时它可以工作,但是当由于空格而有选项时它会失败。我尝试了以下方法来传递带有所需引号的变量:

openal=' "Monitor of Áudio interno Estéreo analógico" '

在变量值中间添加单引号,结果是:

'"Monitor' of Áudio interno Estéreo 'analógico"'

结果,失败了。

如果我尝试使用:

openal="  'Monitor of Áudio interno Estéreo analógico' " 

其结果是:

''\''Monitor' of Áudio interno Estéreo 'analógico'\'''

失败。

有没有办法传递带有所需引号的变量?我想通过:

"Monitor of Áudio interno Estéreo analógico"

或者

'Monitor of Áudio interno Estéreo analógico'

但它也必须接受不带任何引号的值。因此,我相信我应该能够在需要引号时使用引号设置变量值,如果不需要引号或会导致错误,则不使用引号。

谢谢。

答案1

如果问题是空参数导致问题,请考虑使用数组构建命令行,以便可以过滤掉空变量:

opts=()
add_opt() {
    for i; do [[ -n "$i" ]] && ops+=("$i"); done
}
add_opt "${monitorsom}" "${openal}" "${micro}" "${microal}" "${complexo}"

然后:

env PULSE_LATENCY_MSEC=5 ffmpeg -vsync passthrough \
-vaapi_device /dev/dri/renderD128 -hwaccel vaapi -hwaccel_output_format vaapi \
"${opts[@]}"   \
-thread_queue_size 4096 -framerate 30  \
-f x11grab -s "$(xdpyinfo  | grep -oP 'dimensions:\s+\K\S+')" -i :0.0  \
-acodec libfdk_aac -b:a 192k \
-vf 'format=nv12,hwupload' -vcodec h264_vaapi \
-f flv "${nome}"

如果 anopts为空,"${opts[@]}"则展开为空,我们已经过滤掉了空变量。

(我会继续将每个选项放入数组中。当我有很长的命令行时,我倾向于这样做:

opts=(
"opt1"
"opt2"
...
)
cmd "${opts[@]}"

这让我更容易跟踪选项。)

相关内容