gpt4 book ai didi

java - shell脚本执行中字符串连接错误

转载 作者:行者123 更新时间:2023-12-01 09:18:10 25 4
gpt4 key购买 nike

这是一个让我困惑了好几天的有线问题。我想通过解析 shell 中的 java 代码文件来获取类的完整类名。我们可以从以下位置获取包名称:

包com.android.mail.ui;

并从代码文件路径获取类名,使用shell命令'basename'。下面是我的 shell 脚本:

#!/bin/bash
get_package_name(){
java_file=$1
if [ ! -f $file_path ]; then
echo "Sorry,the java file is not exist:$1,please check"
exit 1
fi
class_base_name=`basename "$java_file" .java`
echo "class_base_name:$class_base_name"
package_name=`grep $java_file -e "^package" | awk -F " " '{print $2}' | tr ';' ' ' | sed 's/ //g'`
echo "package_name get result:$?"
echo "package_name:$package_name"

方法一,直接使用变量concat

    classpath_name=$package_name.$class_base_name
echo "method 1 classpath_name:$classpath_name"

方法2,使用sed Replace间接获取concat

    classpath_name2=`echo "aa.bb" | sed "s/aa/$package_name/" | sed "s/bb/$class_base_name/"`
echo "method 2 classpath_name2:$classpath_name2"

}

The problem is:for some code file the result is ok,like: "class_base_name:MailTransport package_name get result:0 package_name:com.android.email.mail.transport method 1 classpath_name:com.android.email.mail.transport.MailTransport method 2 classpath_name2:com.android.email.mail.transport.MailTransport"

for others it's output is : "class_base_name:EmailApplication package_name get result:0 package_name:com.android.email .EmailApplicationh_name:com.android.email .EmailApplicationh_name2:com.android.email"

the result is totally messing and wrong.I doubt it relates the code content,that really make sense for the result?

最佳答案

发生这种情况是因为您的某些文件使用 Windows 样式 CRLF (\r\n) 行终止符。

这是一个工作示例,一个普通的 Unix 风格 LF (\n) 终止文件:

$ file WorkingFile.java
WorkingFile.java: ASCII text

$ cat -v WorkingFile.java
package foo.bar.baz;

$ get_package_name WorkingFile.java
class_base_name:WorkingFile
package_name get result:0
package_name:foo.bar.baz
method 1 classpath_name:foo.bar.baz.WorkingFile

这是一个失败的示例,带有 CRLF 行终止符:

$ file FailingFile.java
FailingFile.java: ASCII text, with CRLF line terminators

$ cat -v FailingFile.java
package foo.bar.baz;^M <--- note hidden control char revealed by -v

$ get_package_name FailingFile.java
class_base_name:FailingFile
package_name get result:0
package_name:foo.bar.baz
.FailingFilesspath_name:foo.bar.baz

要修复此问题,您可以使用 tr -d '\r' 删除多余的回车符。我从传统的反引号切换到现代的 $() 以避免反斜杠问题:

package_name=$(grep $java_file -e "^package" | awk -F " " '{print $2}' | tr ';' ' ' | sed 's/ //g' | tr -d '\r')

有关详细信息,请参阅this relevant post .

关于java - shell脚本执行中字符串连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40371319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com