bash 用带空格的参数分配变量

Posted

技术标签:

【中文标题】bash 用带空格的参数分配变量【英文标题】:bash assign variable with parameters with space in value 【发布时间】:2020-07-17 15:45:21 【问题描述】:

我需要通过我的ytdlExtraOptions 变量将--external-downloader ffmpeg --external-downloader-args -movflags frag_keyframe+empty_moov 作为4 个参数传递给我的一个bash 函数(在我的.bash_functions 中定义):

$ set -- --external-downloader ffmpeg --external-downloader-args -movflags\ frag_keyframe+empty_moov
$ echo $4
-movflags frag_keyframe+empty_moov
$ ytdlExtraOptions="--external-downloader ffmpeg --external-downloader-args -movflags\\ frag_keyframe+empty_moov"
$ set -- $ytdlExtraOptions
$ echo $4
-movflags\

使用 bash 数组:

$ ytdlExtraOptions=(--external-downloader ffmpeg --external-downloader-args -movflags\ frag_keyframe+empty_moov)
$ echo $ytdlExtraOptions[3]
-movflags frag_keyframe+empty_moov
$ set -- $ytdlExtraOptions[@]
$ echo $4
-movflags

如何正确分配我的ytdlExtraOptions 变量?

【问题讨论】:

你真的不能。使用 bash 数组。 @KamilCuk 我要用 bash 数组重写我的问题。 不清楚你在问什么。请澄清一下很酷。 @LéaGris 我重写了我的问题以澄清事情。如果它更容易理解,请撤消你的否决:) 您已经分配了它,但请在您的数组变量引用周围添加双引号:set -- "$ytdlExtraOptions[@]",它会正确设置您的参数。 【参考方案1】:

使用 bash 数组。

set -- --external-downloader ffmpeg --external-downloader-args "-movflags frag_keyframe+empty_moov"
toto=("$@")
set -- "$toto[@]"
echo $4

或者,您可以使用 evil evalprintf "%q " 正确引用和重新评估您的参数:

set -- --external-downloader ffmpeg --external-downloader-args "-movflags frag_keyframe+empty_moov"
toto=$(printf "%q " "$@")
eval set -- "$toto"

【讨论】:

以上是关于bash 用带空格的参数分配变量的主要内容,如果未能解决你的问题,请参考以下文章

bash:以空格作为参数传递路径?

带空格的 Bash 变量

为啥变量赋值中的空格会在 Bash 中出错? [复制]

Bash 在第一个空格后结束变量?

在bash中,如何将N个参数连接在一起作为空格分隔的字符串

将字符串变量分配给空格字符“”以查找重复的单词