コマンドラインでURLを入力として使用するか、入力が提供されない場合は、内部リストを使用するyt-dlp用のシェルスクリプトを作成しようとします。入力が与えられるとスクリプトは機能しますが、入力が与えられないと競合が発生するため、内部リストを使用します。
#!/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-dlpがテキストファイルパスをオプションと見なすのはなぜですか?
私は初めてシェルスクリプトに触れ、ベストプラクティスが何であるかわからないので、一般的な改善も歓迎します。
ベストアンサー1
あなたの質問には2つの側面があります。
- ファイル名を保持していると見なされる文字列にリテラル引用符を含めます。引用符はファイル名の一部ではないため、文字列に含めないでください。
--batch-file
ファイルパス名を含む文字列にこのオプションを含めることができます。これにより、引用符で囲まれていない変数拡張を適切に分割するためにシェルに依存します。引用された拡張のため、$Download
シェルは文字列を分割せず、文字列全体が単一の引数として使用されます。
#!/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
(same as)を使用して、読み取る宛先に渡します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だけでなく、必要な数の追加引数を渡すことができます。