记一次使用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}')
如需转载,请注明文章出处,谢谢!!!