我有以下bash脚本:
public static void main(String[] args) {
try {
File file = new File("");
File soundFile = new File(file.getAbsolutePath() + "/coin.wav");
AudioInputStream audioIn = AudioSystem.getAudioInputStream(soundFile);
Clip clip = AudioSystem.getClip();
clip.open(audioIn);
clip.start();
Thread.sleep(60 * 1000); // The sleep time should be length of your wav file
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
为什么我会:
files=[ls .]
for file in $files
do
digits=$(echo $file | sed "s/[^0-9]*\([0-9]\+\).*/\1/p")
if [[ $digits -gt 1000 ]]
then
rm $file
fi
done
其中11923是$ digits变量值为11923的一条打印行的示例?
修改
我发现了错误。 debuger说$数字的值是重复的(ex' 1001 1001')。不过,我不知道为什么会这样。调试器的输出:
11923: syntax error in expression (error token is "11923")
答案 0 :(得分:1)
当前存在的问题是:
files=[ls .]
这应该使用$(...)
来执行命令并捕获其输出。
files=$(ls .)
尽管如此,avoid parsing the output of ls
最好。最好摆脱$files
并使用*
循环遍历当前目录中的所有文件。
for file in *
答案 1 :(得分:1)
您无法使用ls
填充[ this ]
最简单的方法是使用globbing即
for file in ./*
do
# do something with $file
done
您可以将扩展正则表达式与sed
digits=$(echo "$file" | sed -E "s/[^0-9]*([0-9]+).*/\1/p")
并注意$file
是双引号。
关于错误
11923: syntax error in expression (error token is "11923")
这是因为您在p
替换后添加了sed
标记。
将其更改为
digits=$(echo "$file" | sed -E "s/[^0-9]*([0-9]+).*/\1/")
默认情况下,sed
默认打印内容,除非您使用-n
选项
答案 2 :(得分:1)
您的代码可以简化为:
for file in *; do
[[ $file =~ ([0-9]+) ]] && (( 10#${BASH_REMATCH[0]} > 1000 )) && rm "$file"
done
它不会为每个文件调用sed
,因此效率更高。如果这还不够,你可以使用更高级的正则表达式。
答案 3 :(得分:0)
此处,此脚本应该适用于您的情况
#!/bin/bash
for file in ./f*
do
digits=$(echo -n $file | sed -n -e "s/[^0-9]*\([0-9]\+\).*/\1/p")
if [ $digits -gt 1000 ]
then
rm $file
fi
done
在ls
中解析返回的结果很棘手,如另一个答案所述。以下是我为改变它而改变的一些事情。
首先,echo -n
,不会打印额外的新行字符。
然后sed -n
,sed的安静模式,不会打印不匹配的行
最后,更重要的是,[
的语法与[[
不同。如果您想使用-gt
,则需要使用[
。