我正在尝试构建一个脚本,如标题所示,但我对Bash有些不熟悉,其他在线资源只是如此有用。
#! /bin/bash
function inout #Create Function inout
{
output[0]=" " #Initialize variables
input[0]=" "
count=1
while [ "$count" -lt 10 ]; #Start loop to get all filenames
do
echo "Grabbing filename" #User feedback
input=$(ls | grep 0$count | grep MID | sed 's/ /\\ /g') #Grab filename
#Replace ' ' character with '\ '
output=$(echo $input | tr 'MID' 'mp3')
#set output filename
echo $count #Output variables for testing
echo $input
echo $output
let count+=1 #Increment counter
echo "converting $input to $output." #User feedback
foo="timidity $input -Ow -o - | ffmpeg -i - -acodec libmp3lame -ab 320k $output"
echo $foo
#The last two lines are for the purpose of testing the full output
#I can get the program to run if I copy and paste the output from above
#but if I run it directly with the script it fails
done
}
inout
我试图找出为什么我不能从脚本内部运行它,以及为什么我必须复制/粘贴$ foo的输出
有什么想法吗?
答案 0 :(得分:3)
无法从代码中判断输入文件是如何命名的;我会假设song_02.MID
:
inout () {
for input in song_*.MID; do
output=${input%.MID}.mp3
timidity "$input" -Ow -o - | ffmpeg -i - -acodec libmp3lame -ab 320k "$output"
done
}
它们的关键是定义一个匹配输入文件的适当模式,然后使用for
循环遍历匹配的文件。
另外,您对tr
的使用不正确:该调用会将所有M
,I
或D
替换为m
,{{分别为1}}和p
;它不会将{3}字符串3
的出现替换为MID
。