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

B.A*_*ews 3 csh mkdir

我不确定为什么当我使用 mkdir -p $fbase 一个不需要的?附加到目录的名称 (27obs87St01Rec1?) 。我遵循了类似的线程并运行 cat -A filename 以查看脚本中是否有不需要的字符,但似乎没有。我还运行了 dos2unix 文件名。我正在 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
Run Code Online (Sandbox Code Playgroud)

完整的脚本如下...

#!/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
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 7

我在水晶球中看到输入文件是在 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
Run Code Online (Sandbox Code Playgroud)

或者,要制作干净的副本,您可以使用

</path/to/windows/file tr -d '\r' >/path/to/unix/file
Run Code Online (Sandbox Code Playgroud)

如果您希望使脚本健壮,请在读取文件时删除 CR:

set fbase = `head -$iev stationlist1.csv | tail -1 | tr -d '\r'`
Run Code Online (Sandbox Code Playgroud)