记一次使用awk的错误使用

  awk的用法就不再阐述,感兴趣的话,可以看一下awk使用方法,主要用来做文本处理的。

  以我的错误操作为例,我有一个java源文件,现在呢,我想要用javac命令来编译,生成*.class文件,然后呢,使用java命令来运行class文件。

public class Test{
    public static void main(String [] args) {
        System.out.println("hello world")
    }
}

  于是我在命令行中使用下面的命令:

javac Test.java  && java Test

  这条命令是可以完成我们的目的(前提是在bash中,而不是在powershell中),如果我在powershell中执行上面的命令,会报如下错误:

PS C:\Users\13550\Desktop\Java> javac Test.java && java Test
所在位置 行:1 字符: 17
+ javac Test.java && java Test
+                 ~~
标记“&&”不是此版本中的有效语句分隔符。
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : InvalidEndOfLine

  

  现在还是回到bash上,虽然在bash上没问题,但有个问题,如果要编译运行其他java文件,就要重新写一个这条命令中的Test.java和Test。

  考虑了一下,选择写一个shell脚本,接收命令行传入的参数,作为javac和java的参数即可

  于是乎,很流程的写出下面这个很看似没错的代码:

#!/bin/bash
# BuildAndRun.sh
# 编译并运行java代码

# $1为传入的要编译的java源码
file=$1
javac $file

# 获取class文件,Test.java编译生成的是Test,以.分隔
class=$(awk -F '.' '{print $1}' $file)
java $class

  但是在运行的时候出错了,首先,生成了*.class文件,就是在执行的时候出错。测试打印了一下class变量的值,让我有点尴尬:

#!/bin/bash
# BuildAndRun.sh
# 编译并运行java代码

# $1为传入的要编译的java源码
file=$1
javac $file

# 获取class文件,Test.java编译生成的是Test,以.分隔
class=$(awk -F '.' '{print $1}' $file)
# java $class

# 调试,查看class变量是啥玩意儿
echo $class

  运行测试:

$ ./BuildAndRun.sh Test.java
public class Test{ public static void main(String [] args) { System } }

  从输出的class变量值就可以看出,class保存的并不是我们期望的Test.java的前缀Test,而是将Test.java的内容进行了处理。

 

  找到问题之后,解决方法就很简单了,就不写出全部代码了,只写awk那一条:

class=$(echo $file | awk -F '.' '{print $1}')

 

posted @ 2018-10-23 19:22  寻觅beyond  阅读(1174)  评论(0编辑  收藏  举报
返回顶部