我正在尝试为yt创建一个shell脚本,该脚本将URL作为命令行的输入,或者如果没有输入,则使用内部列表。该脚本在给定输入时工作,但在没有输入时崩溃,因此使用内部列表。
#!/usr/bin/env bash
URLfromTerminal="$1"
PathToList="--batch-file '${HOME}/bin/ytdlp/Lists/Test.txt'"
[[ -z "$URLfromTerminal" ]] && Download="$PathToList" || Download="$URLfromTerminal"
yt-dlp -ciw \
-S "res:1920" \
--ffmpeg-location "$HOME"/bin/ffmpeg/ffmpeg \
"$Download"
如果没有输入并使用内部列表,则会发出错误消息:
yt-dlp: error: no such option: --batch-file '/Users/UserName/bin/ytdlp/Lists/Test.txt'
为什么从变量展开时yt将文本文件的路径作为选项处理?
我对shell脚本很陌生,不知道什么是最佳实践,所以任何一般性的改进都是受欢迎的。
发布于 2022-12-16 13:10:20
你的问题有两方面:
--batch-file
。这迫使您依赖shell来正确拆分未引用的变量展开。由于引用了$Download
的扩展,shell不会拆分字符串,整个字符串被用作单个参数。#!/bin/sh
if [ -n "$1" ]; then
printf '%s\n' "$1"
else
cat ~/bin/ytdlp/Lists/Test.txt
fi |
yt-dlp -ciw \
-S res:1920 \
--ffmpeg-location ~/bin/ffmpeg/ffmpeg \
-a -
这将使用简单的-n
测试来检测第一个参数是否为空。如果它不是空的,它将与printf
一起传递给yt-dlp
,后者将使用-a -
(与--batch-file -
相同)读取它。如果文本文件为空,则通过yt-dlp
将文本文件传递给cat
。
以一种更类似于你正在尝试的方式来解决它:
#!/bin/sh
if [ -z "$1" ]; then
set -- -a ~/bin/ytdlp/Lists/Test.txt
fi
yt-dlp -ciw \
-S res:1920 \
--ffmpeg-location ~/bin/ffmpeg/ffmpeg \
"$@"
如果yt-dlp
是非空的,则将脚本的参数列表传递给$1
。否则,在调用-a
之前,它会将参数列表设置为yt-dlp
和文本文件的路径名。
这将允许您在脚本的命令行中传递任意数量的附加参数,而不仅仅是一个URL。
发布于 2022-12-16 12:21:33
小心你在引用什么!您正在尝试传递两个参数字符串,即
--batch-file
和
'/Users/UserName/bin/ytdlp/Lists/Test.txt'
作为一个论点,
"--batch-file '/Users/UserName/bin/ytdlp/Lists/Test.txt'"
例如,yt知道一个名为--batch-file
的参数(即它知道如何解释参数字符串),就像它知道--help
一样,但它不知道--batch-file '/Users/UserName/bin/ytdlp/Lists/Test.txt'
。
简单地说,在最后一行中,不要将"
放在$Download
旁边。
发布于 2022-12-16 12:38:18
通常是更安全更好到引号壳变量。但是,在这种情况下,是引号破坏了脚本,因为"--batch-file '${HOME}/bin/ytdlp/Lists/Test.txt'"
是作为单个参数传递的,而不是作为一个标志及其值传递的。仍然允许您处理任意文件名的最简单的解决方案是只在变量中放置路径,而不是选项:
#!/usr/bin/env bash
URLfromTerminal="$1"
PathToList="$HOME/bin/ytdlp/Lists/Test.txt"
if [[ -z "$URLfromTerminal" ]]; then
DownloadFlag="--batch-file"
DownloadPath="$PathToList"
else
DownloadPath="$URLfromTerminal"
fi
yt-dlp -ciw \
-S "res:1920" \
--ffmpeg-location "$HOME"/bin/ffmpeg/ffmpeg \
"$DownloadFlag" "$DownloadPath"
当$DownloadFlag
为空时,它将作为空字符串传递,因此该命令仍将工作。
传递带空格的参数的标准安全方法是使用数组。因此,您可能也需要研究这个选项,因为对于更复杂的情况来说,这是必要的:
#!/usr/bin/env bash
URLfromTerminal="$1"
PathToList="$HOME/bin/ytdlp/Lists/Test.txt"
if [[ -z "$URLfromTerminal" ]]; then
DownloadPath=( "--batch-file" "$PathToList")
else
DownloadPath=( "$URLfromTerminal" )
fi
yt-dlp -ciw \
-S "res:1920" \
--ffmpeg-location "$HOME"/bin/ffmpeg/ffmpeg \
"${DownloadPath[@]}"
https://unix.stackexchange.com/questions/728685
复制相似问题