Como eu processo uma variável?

0

Eu quero processar um grupo de arquivos.

pi@raspberrypi:~/A6.1 $ ls -1

0bd57df4.code
0bd57df4.enc
3189204c.code
3189204c.enc
39f831fb.code
39f831fb.enc
68ff6d19.code
68ff6d19.enc
find.sh
test.sh

Eu executo um script ( find.sh ) que procura por arquivos pela máscara, e executa outro script ( test.sh ) e passa o nome do arquivo encontrado para o parâmetro.

No modo de teste, quero exibir o nome completo do arquivo e o nome abreviado sem uma extensão.

O conteúdo do arquivo find.sh:

#!/bin/bash

find -name '*.enc' -printf "%f
# !/bin/bash

NAMEFILE=$1
FULLNAME=$NAMEFILE
CUTNAME='echo ${NAMEFILE:0:6}'
echo "FULLNAME - "$FULLNAME
echo "FILENAME - $CUTNAME"
" | xargs -0 -n 1 ./test.sh

O conteúdo do arquivo test.sh:

pi@raspberrypi:~/A6.1 $ ./find.sh
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 68ff6d19.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 3189204c.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 39f831fb.enc
FILENAME -
./test.sh: 1: ./test.sh: Bad substitution
FULLNAME - 0bd57df4.enc
FILENAME -

O nome completo é exibido, não há nome abreviado. Dá uma mensagem de erro. Como faço para processar uma variável?

pi@raspberrypi:~/A6.1 $ ./test.sh 68ff6d19.code
FULLNAME - 68ff6d19.code
CUTNAME - 68ff6d19

Quando eu executo o arquivo test.sh, ele funciona.

pi@raspberrypi:~/A6.1 $ ls -1

0bd57df4.code
0bd57df4.enc
3189204c.code
3189204c.enc
39f831fb.code
39f831fb.enc
68ff6d19.code
68ff6d19.enc
find.sh
test.sh
    
por Ruslan Kramskoy 03.04.2018 / 22:35

2 respostas

0

Tenho a sensação de que você pode concentrar seu código usando o GNU Parallel:

find -name '*.enc' | parallel echo Full:{} Cut:{.}

Ou se o código for mais complicado:

#!/bin/bash

doit() {
  FULLNAME="$1"
  CUTNAME="$2"
  echo "FULLNAME - $FULLNAME"
  echo "FILENAME - $CUTNAME"
}
export -f doit

find -name '*.enc' | parallel doit {} {.}
    
por 19.04.2018 / 22:29
0

O erro vem da execução do script com /bin/sh , que não possui a expansão de parâmetro específica que você usa. Você está usando /bin/sh porque tem um espaço entre o # e o ! na primeira linha.

São permitidos espaços após o ! : O espaço é permitido entre #! e / bin / bash em shebang?

Também relacionado: Qual interpretador de shell executa um script sem shebang?

Você pode se safar facilmente com um único script aqui:

find . -type f -name '*.enc' -exec bash -c '
    for n do
        n=${n##*/}
        printf "Full name:\t%s\n" "$n"
        printf "Cut name:\t%s\n"  "${n:0:6}"
    done' sh {} +

Executar isso nos nomes de arquivo que você apresentar produzirá

Full name:      0bd57df4.enc
Cut name:       0bd57d
Full name:      3189204c.enc
Cut name:       318920
Full name:      39f831fb.enc
Cut name:       39f831
Full name:      68ff6d19.enc
Cut name:       68ff6d

Se você quiser apenas remover a extensão:

find . -type f -name '*.enc' -exec sh -c '
    for n do
        n=${n##*/}
        printf "Full name:\t%s\n" "$n"
        printf "Cut name:\t%s\n"  "${n%.*}"
    done' sh {} +

Isso produz

Full name:      0bd57df4.enc
Cut name:       0bd57df4
Full name:      3189204c.enc
Cut name:       3189204c
Full name:      39f831fb.enc
Cut name:       39f831fb
Full name:      68ff6d19.enc
Cut name:       68ff6d19
    
por 19.04.2018 / 22:42

Tags