Ponto de interrogação indesejado acrescentado ao nome do diretório ao usar o mkdir

3

Eu não tenho certeza porque quando eu uso mkdir -p $ fbase um indesejado? é anexado ao nome do diretório (27obs87St01Rec1?). Eu segui tópicos semelhantes e executei cat -A filename para ver se há caracteres indesejados no script, mas não parece haver. Eu também executei o nome do arquivo dos2unix. Eu estou escrevendo o script a partir do zero em uma máquina Linux, sem influência do Windows. É porque estou usando um parâmetro $ filebase. Aprecie qualquer ajuda

#!/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

O script completo está abaixo ...

#!/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
    
por B.Andrews 27.01.2016 / 04:27

1 resposta

5

Eu vejo na minha bola de cristal que o arquivo de entrada foi preparado no Windows.

Aposto que o personagem não é um ponto de interrogação, é apenas a maneira de ls de dizer a você que existe um personagem não imprimível. O caractere não imprimível em questão é um caractere de retorno de carro (CR, comumente representado como \r ou 5 ou ^M ).

Um caractere CR aparece no final das linhas de arquivos de texto que foram produzidos no Windows. Windows e Unix representam arquivos de texto de maneira diferente: o Unix usa o caractere LF ( \n , 2 , ^J ) como um terminador de linha (ou seja, cada linha consiste em caracteres imprimíveis seguidos por LF), enquanto o Windows usa seqüência de caracteres CR-LF como um separador de linha (ou seja, cada linha consiste em seus caracteres imprimíveis seguidos por CR seguido por LF, exceto que a última linha geralmente consiste apenas em caracteres imprimíveis). Então, quando você copia um arquivo de texto do Windows para um sistema Unix, ele tem esse caractere CR falso no final de cada linha, exceto às vezes o último. No que diz respeito ao Linux ou a outros sistemas Unix, o caractere CR é um caractere comum (embora não imprimível), portanto, ele permanece lá e causa problemas.

Você deve converter o arquivo para um arquivo de texto Unix. No Linux, você pode usar

sed -i -e 's/\r$//' /path/to/file

Como alternativa, para fazer uma cópia limpa, você pode usar

</path/to/windows/file tr -d '\r' >/path/to/unix/file

Se você preferir tornar seu script robusto, remova o CR ao ler o arquivo:

set fbase = 'head -$iev stationlist1.csv | tail -1 | tr -d '\r''
    
por 28.01.2016 / 01:13

Tags