这是我正在编写的 shell 脚本:
#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
这很简单 - 我只是想自动化一些命令,而不是一遍又一遍地写它们......
但我遇到了一些奇怪的错误。这是我的第一个 shell 脚本,所以我不确定我做错了什么。
当我到达最后一行时:
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 可以轻松解析它。
对于您的情况,第三个选项应该是最简单的。