私が作成しているシェルスクリプトは次のとおりです。
#FOR YOUTUBE-DL COMMAND
read -r -p "Do you want to download a link? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
read -e -p "Enter Youtube link: " youtube_link
youtube-dl $youtube_link -o "/home/tex/catkin_ws/youtube_videos/%(title)s%(ext)s" -f mp4
fi
#FOR FFMPEG COMMAND
read -e -p "Enter video file dir: " video_dir
video_dir="${video_dir/#\~/$HOME}"
echo $video_dir
read -e -p "Enter fps: " fps
read -e -p "Enter video file image destination: " image_destination
image_destination="${image_destination/#\~/$HOME}"
image_format="image-%04d.jpeg"
image_destination=$(echo ${image_destination}${image_format})
ffmpeg -i $video_dir -r $fps $image_destination
簡単です。いくつかのコマンドを繰り返し作成するのではなく、自動化したいだけです。
しかし、奇妙なエラーが発生します。これは私の最初のシェルスクリプトなので、何が間違っているのかわかりません。
最後の行に達すると:
ffmpeg -i $video_dir -r $fps $image_destination
$video_dir
ffmpegコマンドに問題があります。まず、私は:
echo $video_dir
13行目で私は以下を得る:
/home/usr/ws/youtube_videos/AIRSOFT - 4 Player Split Screenmp4
しかし、
ffmpegはエラーを返します:
/home/usr/ws/youtube_videos/AIRSOFT: No such file or directory
これは最初の部分(AIRSOFT)のみを読み、残りの部分(AIRSOFT - 4....)は読み取らないのと同じです。
理由がありますか?
答え1
Bashは、ファイル名の残りの部分にスペースを使用する方法を知りません。 Bashがフルファイル名を使用するように指定(エスケープ)する必要があります。
だからあなたはできます
- 「AIRSOFT - 4 Player Split Screen.mp4」を「AIRSOFT\ -\ 4 \ Player Split \ Screen.mp4」に変更します。
- 引用符を追加します
$video_dir
。 (?) - bashが簡単に解析できるように、ファイル名をスペースなしで別の名前に変更します。
あなたの場合は、3番目のオプションが最も簡単です。