使用 mkdir 时目录名称中附加了不需要的问号

使用 mkdir 时目录名称中附加了不需要的问号

我不确定为什么当我使用 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,通常表示为\ror\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'`

相关内容