bash脚本中表达式中的语法错误

时间:2018-01-14 15:29:32

标签: bash

我有以下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")

4 个答案:

答案 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,则需要使用[