script de shell funciona bem quando executado no terminal, mas erros saem quando executados como programa simultâneo

1

Estou tentando adicionar os comandos de manipulação de string abaixo em meu script de shell existente.

#!/bin/ksh
y=${#text}
echo "Length of text: $y"
echo "Last _ is in column $((${#text} - ${#end}))"
echo "Our position is till column $((${#text} - ${#end}-$x))"

len='expr $((${#text} - ${#end}-$x))'
echo $len

val=$( echo $text $len|awk '{print substr($0,0,$2)}')

echo $val
count='ls $val*|wc -l'
echo $count

Os comandos acima funcionam bem quando executados no terminal. mas quando eu adiciono ao meu script de shell existente que está sendo executado como um programa concorrente, o programa comete erros lançando o erro "Bad substitution". E eu sou capaz de identificar os erros no código adicionado recentemente para manipulações de strings.

Eu posso ver que o código é interpretado como shell korn e eu usei comandos shell korn apenas que funcionam no terminal, mas quando adicionados ao script unix do programa concorrente existente ele cometeu erros.

Abaixo está o código no meu script existente junto com comandos recém-adicionados

#Parameters : Takes the following input parameters.
# 1) Input base directory   -- parameter 5
# 2) File Pattern           -- Parameter 6
# 3) Appl short name        -- parameter 7
# 4) appl. resp.            -- parameter 8
# 5) Debug                  -- parameter 9
#=======================================================================
#!/bin/ksh
AppsUser="$3"
BaseDir="$5"
FilePattern="$6"
AppShortName="$7"
AppResp="$8"
DebugProgram="$9"

echo "Apps User=$AppsUser"
echo "Base Directory=$BaseDir"
echo "File Pattern=$FilePattern"
echo "App Short Name=$AppShortName"
echo "App Responsibility=$AppResp"
echo "Debug Program=$DebugProgram"

IncomingDir="$BaseDir/incoming"
ProcessedDir="$BaseDir/processed"
ProcessingDir="$BaseDir/processing"
TempFile="$BaseDir/incoming/absn_psoft_glfile_search_results.txt"
ConcProgram="ABSN_PEOPLESOFT_OGL_INTF_MAIN"
echo $ConcProgram
echo $TempFile
IFS="
"
export IFS

cd $IncomingDir
ls *_GL_*.dat 1> /dev/null 2> /dev/null
if [ $? = 0 ]
then
    #for i in 'cat $TempFile'
    for file in 'ls *_GL_*.dat'
     do
      echo "File being processed $file"
       FILENAME=$file
       #echo $FILENAME
       len=${#FILENAME} -->Error thrown for this command
       echo "The length is $len"
       if [ -s $FILENAME ]
        then
      echo "Moving file $FILENAME to $ProcessingDir"
      mv $IncomingDir/$FILENAME $ProcessingDir/$FILENAME
      echo "Submitting concurrent Request using CONCSUB for File=$FILENAME"
      CONCSUB $FCP_LOGIN $AppShortName $AppResp $AppsUser WAIT=N CONCURRENT ABSN $ConcProgram  $FILENAME 0 $DebugProgram $ProcessingDir
      echo "Submitted Request for File=$FILENAME"
      sleep 60
      else
          echo "File size is 0 bytes, moving file to processed directory"
          mv $IncomingDir/$FILENAME $ProcessedDir/$FILENAME.rmv
      fi
    done
else
  echo "No GL PSoft files to process."
fi
#echo "After if"
echo "Completed Job, Exiting program with code 0"
exit 0

O script é anexado como um executável a um programa concorrente oracle e executado usando o programa concorrente

    
por Dhivya 13.04.2016 / 11:35

1 resposta

1

works fine when executed in terminal. but when i add to my existing shell script which is running as a concurrent program, the program errors out throwing the error "Bad substitution".

Erros de sintaxe em um script? Isso geralmente indica que você não está usando o mesmo shell para o script e interativamente.

#Parameters : Takes the following input parameters.
…

Este script não tem , por isso é executado com sh , não com ksh . Em seu sistema, sh é evidentemente um shell Bourne antigo que não entende a expansão aritmética. Você aparentemente pretendia executar o script com ksh, mas a linha #!/bin/ksh deve ser a primeira linha do arquivo. Mova-o antes dos comentários de uso.

Além disso, sempre coloque aspas duplas em torno das substituições de variáveis : cd "$IncomingDir" etc. E não analise a saída de ls : for file in *_GL_*.dat .

    
por 14.04.2016 / 01:58