尝试编写使用vlc创建播放列表的脚本。
#!/bin/bash
filename=/media/*/*.mp3
while [ "$1" != "" ]; do
case $1 in
-f | --filepath ) shift
filename=$1
;;
-h | --help ) usage
exit
;;
* ) usage
exit 1
esac
shift
done
#echo $filename
vlc $filename --novideo --quiet
此脚本正在运行,但它只能在任何USB设备的根目录中找到mp3文件。所以我想改变文件名变量。这段代码给出了类似的结果,但它列出了evething。
filename=$(find /media/* -name *.mp3 -print)
filename=$(tr '\n' ' ' <<<$filename)
现在的问题是我无法将其作为论据传递。我试过了:
vlc $filename --novideo --quiet
or
vlc $*filename --novideo --quiet
or
vlc "$filename" --novideo --quiet
没什么用的。有什么建议吗?
更新
我想要帮助的问题是如何让vlc接受filename变量作为参数或在播放列表中使用的文件参数。文件名包含
/media/MULTIBOOT/Linkin Park - In The End.mp3 /media/MULTIBOOT/Man with a
Mission ft. Takuma - Database.mp3 /media/MULTIBOOT/Sick Puppies - You're
Going Down.mp3 /media/MULTIBOOT/Skillet - Rise.mp3 /media/MULTIBOOT/Song
Riders - Be.mp3 /media/MULTIBOOT/30 Seconds to Mars - This is War.mp3
/media/MULTIBOOT/Fade - One Reason.mp3
现在这是一个字符串如何使用它的文件路径参数?
答案 0 :(得分:3)
我会使用bash的递归globbing和数组:
#!/bin/bash
shopt -s globstar nullglob
files=()
while [[ $1 ]]; do
case $1 in
-f | --filepath ) shift
files+=("$1")
;;
-h | --help ) usage
exit
;;
* ) usage
exit 1
esac
shift
done
if [[ ${#files[@]} -eq 0 ]]; then
files=( /media/**/*.mp3 )
if [[ ${#files[@]} -eq 0 ]]; then
echo "no mp3 files found"
exit 1
fi
fi
#printf "%s\n" "${files[@]}"
vlc "${files[@]}" --novideo --quiet
使用此代码,您可以多次指定-f filename
来播放几首歌曲。
答案 1 :(得分:1)
而不是将所有文件名存储在变量中,您可以告诉find
使用所有文件调用应用程序。这将防止空格,换行符等问题:
find /media -name '*.mp3' -exec vlc --novideo --quiet \{\} \+
答案 2 :(得分:1)
处理脚本中的选项的更好方法可能是使用getopts
,如果您不介意丢失长选项的选项。例如:
#!/usr/bin/env bash
while getopts vqt opt; do
case "$opt" in
f) filename=($OPTARG) ;;
h) usage; exit 0 ;;
*) usage; exit 1 ;;
esac
done
shift $((OPTIND - 1))
filename=($(find /media/ -name \*.mp3 -type f))
vlc --novideo --quiet "${filename[@]}"
我不知道VLC的这种用法,但是这个脚本的作用是创建一个命令行,其中包含find
命令找到的所有文件,这些文件存储在 array 叫$filename
。
在数组中处理事物的一个优点是它可以在for
循环中使用。
for thisfile in "${filename[@]}"; do
vlc "$thisfile" # with options to convert just one file
done
请注意,由于您使用的是bash,因此您可能根本不需要使用find
。
shopt -s globstar
filelist=(/media/**/*.mp3)
检查man bash
以了解globstar
。