我不确定为什么当我使用 mkdir -p $fbase 时出现不需要的?附加到目录名称 (27obs87St01Rec1?) 。我遵循类似的线程并运行 cat -A filename 以查看脚本中是否有不需要的字符,但似乎没有。我还运行了 dos2unix filename。我正在 Linux 机器上从头开始编写脚本,因此不受 Windows 的影响。是因为我使用了参数 $filebase.感谢任何帮助
#!/bin/csh
# Distribute files into separate directories and run SHEBA on each
# Check what phase to run analysis for
echo "RUN_SHEBA.CSH: CNTRL-C to abort"
unalias sac
mkdir -p filtered
mkdir -p stack
mkdir -p plots
mkdir -p results
# READ STATION LIST
set nev = `cat stationlist1.csv | wc -l`
echo "NUMBER OF EVENTS=" $nev
@ iev = 1
echo $iev
# LOOP OVER EVENTS
while ($iev <= $nev)
echo "CURRENT EVENT=" $iev
# EXTRACT EVENT LINE
set fbase = `head -$iev stationlist1.csv | tail -1`
echo $fbase
# CLEAN UP ANY PRE-EXISTING DIRECTORIES
\rm -rf $fbase
mkdir -p $fbase
# COPY THE FILES
cp ~/SAC/sac/macros/$fbase.* $fbase
cd $fbase
完整的脚本如下...
#!/bin/csh
# Distribute files into separate directories and run SHEBA on each
# Check what phase to run analysis for
echo "RUN_SHEBA.CSH: CNTRL-C to abort"
unalias sac
mkdir -p filtered
mkdir -p stack
mkdir -p plots
mkdir -p results
# READ STATION LIST
set nev = `cat stationlist1.csv | wc -l`
echo "NUMBER OF EVENTS=" $nev
@ iev = 1
echo $iev
# LOOP OVER EVENTS
while ($iev <= $nev)
echo "CURRENT EVENT=" $iev
# EXTRACT EVENT LINE
set fbase = `head -$iev stationlist1.csv | tail -1`
echo $fbase
# CLEAN UP ANY PRE-EXISTING DIRECTORIES
\rm -rf $fbase
mkdir -p $fbase
# COPY THE FILES
cp ~/SAC/sac/macros/$fbase.* $fbase
cd $fbase
## CONFIGURE SHEBA
# BUILD THE ANALYSIS MACRO
cat << END >.temporary_sac_shebanew
setmacro /apps/SAC/sac/macros
window 1 X 0.1 0.6 Y 0.50 1.00
qdp off
gtext hardware
END
echo "m shebanew file $fbase comps C1 C2 C3 pick no plot yes batch yes" >>.temporary_sac_shebanew
# RUN SHEBA
sac .temporary_sac_shebanew
\cp ${fbase}_result.eps ../plots
\cp ${fbase}.lam2 ../stack
\cp *.final_result ../results
cd..
@ iev = $iev + 1
echo "I AM FINISHED"
end
答案1
我在水晶球中看到输入文件是在 Windows 下准备的。
我敢打赌这个角色不是问号,这只是ls
告诉你有一个无法打印的角色。所讨论的不可打印字符是回车符(CR,通常表示为\r
or\015
或^M
)。
CR 字符出现在 Windows 上生成的文本文件行的末尾。 Windows 和 Unix 表示文本文件的方式不同:Unix 使用 LF 字符 ( \n
, \012
, ^J
) 作为行终止符(即每行由其可打印字符后跟 LF 组成),而 Windows 使用两个字符序列 CR-LF 作为行分隔符(即每一行都由其可打印字符组成,后跟 CR,后跟 LF,但最后一行通常仅由其可打印字符组成)。因此,当您将 Windows 文本文件复制到 Unix 系统时,除了有时最后一行之外,它的每一行末尾都有这个虚假的 CR 字符。对于Linux或其他Unix系统而言,CR字符是一个普通字符(尽管是一个不可打印的字符),因此它就留在那里并引起麻烦。
您应该将该文件转换为 Unix 文本文件。在 Linux 上,您可以使用
sed -i -e 's/\r$//' /path/to/file
或者,要制作干净的副本,您可以使用
</path/to/windows/file tr -d '\r' >/path/to/unix/file
如果您希望使脚本更加健壮,请在读取文件时删除 CR:
set fbase = `head -$iev stationlist1.csv | tail -1 | tr -d '\r'`