组合两个字符串变量时,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,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查看它们,如果您在输出中看到^Ms,请阅读"为什么我的工具输出会覆盖它自己以及我如何修复它?"?如何处理他们。

不过,不要用[t]csh编写脚本,因为它并不是为此而设计的。用csh写剧本就像用牙刷挖一个洞——当然你最终可以做到,但还有更好的选择。看见https://www.google.com/search?q=google+csh+为什么+不。

话虽如此,还不清楚为什么要在任何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

相关内容

  • 没有找到相关文章

最新更新