首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果未提供输入URL,请使用文本文件中的列表

如果未提供输入URL,请使用文本文件中的列表
EN

Unix & Linux用户
提问于 2022-12-16 12:13:33
回答 3查看 380关注 0票数 6

我正在尝试为yt创建一个shell脚本,该脚本将URL作为命令行的输入,或者如果没有输入,则使用内部列表。该脚本在给定输入时工作,但在没有输入时崩溃,因此使用内部列表。

代码语言:javascript
运行
复制
#!/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"

如果没有输入并使用内部列表,则会发出错误消息:

代码语言:javascript
运行
复制
yt-dlp: error: no such option: --batch-file '/Users/UserName/bin/ytdlp/Lists/Test.txt'

为什么从变量展开时yt将文本文件的路径作为选项处理?

我对shell脚本很陌生,不知道什么是最佳实践,所以任何一般性的改进都是受欢迎的。

EN

回答 3

Unix & Linux用户

发布于 2022-12-16 13:10:20

你的问题有两方面:

  1. 您可以在字符串中包含文字引号,据称该字符串保存了文件的名称。因为引号不是文件名的一部分,所以它们不应该包含在字符串中。
  2. 在保存文件路径名的字符串中包含选项--batch-file。这迫使您依赖shell来正确拆分未引用的变量展开。由于引用了$Download的扩展,shell不会拆分字符串,整个字符串被用作单个参数。
代码语言:javascript
运行
复制
#!/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

以一种更类似于你正在尝试的方式来解决它:

代码语言:javascript
运行
复制
#!/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。

票数 4
EN

Unix & Linux用户

发布于 2022-12-16 12:21:33

小心你在引用什么!您正在尝试传递两个参数字符串,即

代码语言:javascript
运行
复制
--batch-file

代码语言:javascript
运行
复制
'/Users/UserName/bin/ytdlp/Lists/Test.txt'

作为一个论点,

代码语言:javascript
运行
复制
"--batch-file '/Users/UserName/bin/ytdlp/Lists/Test.txt'"

例如,yt知道一个名为--batch-file的参数(即它知道如何解释参数字符串),就像它知道--help一样,但它不知道--batch-file '/Users/UserName/bin/ytdlp/Lists/Test.txt'

简单地说,在最后一行中,不要将"放在$Download旁边。

票数 2
EN

Unix & Linux用户

发布于 2022-12-16 12:38:18

通常是更安全更好引号壳变量。但是,在这种情况下,是引号破坏了脚本,因为"--batch-file '${HOME}/bin/ytdlp/Lists/Test.txt'"是作为单个参数传递的,而不是作为一个标志及其值传递的。仍然允许您处理任意文件名的最简单的解决方案是只在变量中放置路径,而不是选项:

代码语言:javascript
运行
复制
#!/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为空时,它将作为空字符串传递,因此该命令仍将工作。

传递带空格的参数的标准安全方法是使用数组。因此,您可能也需要研究这个选项,因为对于更复杂的情况来说,这是必要的:

代码语言:javascript
运行
复制
#!/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[@]}"
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/728685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档