微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

组合两个字符串变量时,shell 脚本中出现一个奇怪的错误

如何解决组合两个字符串变量时,shell 脚本中出现一个奇怪的错误

我会在这里发布我的脚本

#!/bin/tcsh 

echo 'Running'
set fileN = '2021-02-07-0448-04S.JKH_RR.SAC'
set fileE = '2021-02-07-0448-04S.JKH_RR_BHE.SAC'
set compR=BHR
set compT=BHT
set compR_name=BHR.SAC
set compT_name=BHT.SAC
set fileN_rot = `echo $fileN | awk '{split($0,a,".SAC"); print a[1]}'`
set fileE_rot = `echo $fileE | awk '{split($0,".SAC"); print a[1]}'`

echo 'output1'
echo $fileN 
echo $fileE

echo 'output2'
echo $fileN_rot 
echo $fileE_rot 

echo 'output3'
echo $fileE_rot-$compR_name
echo $fileN_rot-$compT_name

输出为:

Running
output1
2021-02-07-0448-04S.JKH_RR_BHN.SAC 2021-02-07-0448-04S.JKH_RR_BHE.SAC

output2
2021-02-07-0448-04S.JKH_RR_BHN
2021-02-07-0448-04S.JKH_RR_BHE

output3
2021-02-07-0448-04S.JKH_RR_BHN
-BHR.SAC
2021-02-07-0448-04S.JKH_RR_BHE-BHT.SAC

echo $fileE_rot-$compR_name 给出错误输出。 这里的输出是从输出文件复制粘贴的,所以 -BHR.SAC 显示在新行中。 但是在 shell 终端中它显示 -BHR.SAC07-0448-04S.JKH_RR_BHN。 我觉得很奇怪。

解决方法

看起来您的字符串中有一些控制字符。运行 cat -Ev script 以查看它们,如果您在输出中看到 ^M,请阅读 Why does my tool output overwrite itself and how do I fix it? 以了解如何处理它们。

不要在 [t]csh 中编写脚本,因为它不是为此而设计的。在 csh 中编写脚本就像用牙刷挖一个洞 - 当然你最终可以到达那里,但有更好的选择。见https://www.google.com/search?q=google+csh+why+not

话虽如此,您为什么要尝试在任何 shell 中操作文本并不明显。 Shell 的存在是为了操作(创建/销毁)文件和进程以及对工具的序列调用。发明shell的人还发明了awk等工具,让shell在合适的时候调用来操作文本。所以,这里是如何真正编写一个shell脚本来做你想做的(shell部分是调用awk来操作文本):

$ cat tst.sh
#!/usr/bin/env bash

awk '
    BEGIN {
        print "Running"
        fileN = "2021-02-07-0448-04S.JKH_RR.SAC"
        fileE = "2021-02-07-0448-04S.JKH_RR_BHE.SAC"
        compR = "BHR"
        compT = "BHT"
        compR_name = "BHR.SAC"
        compT_name = "BHT.SAC"

        fileN_rot = fileN
        sub(/\.SAC$/,"",fileN_rot)

        fileE_rot = fileE
        sub(/\.SAC$/,fileE_rot)

        print "output1"
        print fileN
        print fileE

        print "output2"
        print fileN_rot
        print fileE_rot

        print "output3"
        print fileE_rot "-" compR_name
        print fileN_rot "-" compT_name
    }
'

$ ./tst.sh
Running
output1
2021-02-07-0448-04S.JKH_RR.SAC
2021-02-07-0448-04S.JKH_RR_BHE.SAC
output2
2021-02-07-0448-04S.JKH_RR
2021-02-07-0448-04S.JKH_RR_BHE
output3
2021-02-07-0448-04S.JKH_RR_BHE-BHR.SAC
2021-02-07-0448-04S.JKH_RR-BHT.SAC

或者如果真的有一些理由想要直接在 shell 中执行此操作(例如,此代码在一些循环中操作基于这些变量命名的文件),则:

$ cat tst.sh
#!/usr/bin/env bash

fileN='2021-02-07-0448-04S.JKH_RR.SAC'
fileE='2021-02-07-0448-04S.JKH_RR_BHE.SAC'
compR='BHR'
compT='BHT'
compR_name='BHR.SAC'
compT_name='BHT.SAC'

fileN_rot="${fileN%*.SAC}"
fileE_rot="${fileE%*.SAC}"

echo 'output1'
echo "$fileN"
echo "$fileE"

echo 'output2'
echo "$fileN_rot"
echo "$fileE_rot"

echo 'output3'
echo "${fileE_rot}-${compR_name}"
echo "${fileN_rot}-${compT_name}"

$ ./tst.sh
output1
2021-02-07-0448-04S.JKH_RR.SAC
2021-02-07-0448-04S.JKH_RR_BHE.SAC
output2
2021-02-07-0448-04S.JKH_RR
2021-02-07-0448-04S.JKH_RR_BHE
output3
2021-02-07-0448-04S.JKH_RR_BHE-BHR.SAC
2021-02-07-0448-04S.JKH_RR-BHT.SAC

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。