변수를 어떻게 처리하나요?

변수를 어떻게 처리하나요?

일련의 파일을 처리하고 싶습니다.

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

find.sh마스크로 파일을 검색하는 스크립트( )를 실행한 다음, 다른 스크립트( test.sh)를 실행하고 찾은 파일의 이름을 인수로 전달합니다.

테스트 모드에서 확장자 없이 전체 파일 이름과 약식 이름을 표시하고 싶습니다.

find.sh 파일의 내용:

#!/bin/bash

find -name '*.enc' -printf "%f\0" | xargs -0 -n 1 ./test.sh

test.sh 파일의 내용:

# !/bin/bash

NAMEFILE=$1
FULLNAME=$NAMEFILE
CUTNAME=`echo ${NAMEFILE:0:6}`
echo "FULLNAME - "$FULLNAME
echo "FILENAME - $CUTNAME"

전체 이름을 표시하고 약어는 표시하지 않습니다. 오류 메시지를 표시합니다. 변수를 어떻게 처리하나요?

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 -

test.sh 파일을 실행하면 작동합니다.

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

답변1

GNU Parallel을 사용하면 코드를 중앙 집중화할 수 있을 것 같습니다.

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

또는 코드가 더 복잡한 경우:

#!/bin/bash

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

find -name '*.enc' | parallel doit {} {.}

답변2

/bin/sh사용 중인 특정 매개변수 확장이 없는 스크립트를 실행하면 오류가 발생합니다 . /bin/sh첫 번째 줄의 와 사이에 공백이 있기 때문에 이를 사용합니다 .#!

허용되는 공간뒤쪽에이것 !:Shebang에서 #!과 /bin/bash 사이에 공백이 허용됩니까?

또한 관련:Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?


여기에서 단일 스크립트를 쉽게 사용할 수 있습니다.

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 {} +

제공한 파일 이름에 대해 이 명령을 실행하면

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

확장 프로그램만 제거하려는 경우:

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 {} +

이는

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

관련 정보