【问题标题】:A strange error in shell script while combining two string variables组合两个字符串变量时 shell 脚本中的一个奇怪错误
【发布时间】:2021-09-03 18:30:47
【问题描述】:

我会在这里发布我的脚本

#!/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 输出错误。 这里的输出是从输出文件中复制粘贴的,所以-BHR.SAC 显示在新行中。 但在 shell 终端中显示-BHR.SAC07-0448-04S.JKH_RR_BHN。 我觉得很奇怪。

【问题讨论】:

  • 脚本中的某些行似乎以 DOS 行结尾。

标签: string shell csh tcsh


【解决方案1】:

看起来您的字符串中有一些控制字符。运行cat -Ev script 来查看它们,如果您在输出中看到^Ms,请阅读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 的人还发明了诸如 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2012-09-07
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多