コマンドラインで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だけでなく、必要な数の追加引数を渡すことができます。
答え2
あなたが引用した内容を見てください! 2つのパラメータ文字列を渡そうとします。
--batch-file
そして
'/Users/UserName/bin/ytdlp/Lists/Test.txt'
主張では、
"--batch-file '/Users/UserName/bin/ytdlp/Lists/Test.txt'"
たとえば、yt-dlpは呼び出しパラメータを知っていますが(つまり、パラメータ文字列を解釈する方法を知っていますが)、そうではあり--batch-file
ませ--help
ん--batch-file '/Users/UserName/bin/ytdlp/Lists/Test.txt'
。
最後の行は包まなかった"
。$Download
答え3
一般的により安全でより良い到着シェル変数の引用。ただし、この場合、引用符"--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[@]}"