shell 脚本合并两个字符串变量时出现奇怪的错误

A strange error in shell script while combining two string variables

我会post我的脚本在这里

#!/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([=11=],a,".SAC"); print a[1]}'`
set fileE_rot = `echo $fileE | awk '{split([=11=],a,".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 输出错误。 这里的 out 是从输出文件复制粘贴的,所以 -BHR.SAC 显示在新行中。 但在 shell 终端中显示 -BHR.SAC07-0448-04S.JKH_RR_BHN。 我觉得很奇怪。

看起来你的字符串中有一些控制字符。 运行 cat -Ev script 查看它们,如果您在输出中看到 ^M,请阅读 了解如何处理它们。

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

话虽如此,但您试图在任何 shell 中操作文本的原因并不明显。存在 Shell 来操作 (create/destroy) 文件和进程以及对工具的顺序调用。发明 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