Bash 스크립트에서 변수를 업데이트할 수 없습니다

Bash 스크립트에서 변수를 업데이트할 수 없습니다

현재 폴더의 모든 .txt 파일 이름을 한 줄에 인쇄하려고 합니다. 다음 스크립트를 사용하고 있습니다. 그러나 파일 이름은 인쇄되지 않습니다.

REF_SEQ=""
find . -name "*.txt" -maxdepth 1 -type f |
while read f;
do
    name=$(echo ${f}| xargs -I {} basename {} )
    REF_SEQ+="${name} "
done

echo "Full Sequence:  ${REF_SEQ}"

현재 폴더(A.txt, B.txt ...)에 3~4개의 .txt 파일이 있습니다. 나는 다음과 같이 출력을 기대하고 있습니다.

전체 시퀀스: A.txt B.txt ...

find변수에 출력을 할당하지 않고 명령 만 사용하면 RED_SEQ원하는 출력을 얻을 수 있습니다. 이는 find 명령이 제대로 작동하지만 변수에 할당할 수 없음을 의미합니다. 다양한 할당 연산자를 시도했지만 여전히 운이 없습니다.

답변1

에서 변수를 업데이트하려면 bash다음 구문을 사용해야 합니다.

VAR="some stuff$VAR"

그러나 파이프를 사용하고 있으므로 while루프가 하위 셸에서 실행되므로 변수가 손실됩니다.

이 문제를 해결하려면 다음 구문이 있어야 합니다.

while read f
do
done <<< $(input)

귀하의 경우에는 다음과 같습니다.

REF_SEQ=""

while read f;
do
    name=$(echo ${f}| xargs -I {} basename {} )
    REF_SEQ="${REF_SEQ}${name} "
done <<< $(find . -name "*.txt" -maxdepth 1 -type f)

echo "Full Sequence:  ${REF_SEQ}"

답변2

문제는 파이프 기호 뒤에 {}를 사용한다는 것입니다. 이는 find의 -exec 옵션에서만 유효하지만 파이프 기호 뒤에는 유효하지 않습니다.

다음을 시도해 볼 수 있습니다.

REF_SEQ=$(find . -maxlength 1 -name "*.txt" -type f -printf "%f " | xargs)

그러면 원하는 결과가 나올 것입니다. printf-지시문 %f는 발견된 파일의 기본 이름을 출력하고 xargs는 결과를 "전치"합니다.

감사합니다 Jurgen

관련 정보