在bash scipt中使用string作为参数

时间:2015-09-22 17:12:35

标签: bash terminal vlc

尝试编写使用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

现在这是一个字符串如何使用它的文件路径参数?

3 个答案:

答案 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

的讨论