find를 호출하는 bash 스크립트의 구문 오류

find를 호출하는 bash 스크립트의 구문 오류

이 스크립트에서 오류는 어디에 있습니까?

#!/bin/bash
rep="git"

files=`find' ${rep} '-type f`
for f in ${files} do
    echo $f
done

find git -type f쉘에서 단독으로 실행 하면 작동합니다!

답변1

작은따옴표로 묶인 문자열은 삽입되지 않습니다. 이는 당신이 달리려고 노력하고 있음을 의미합니다.

find ' ${rep} '-type f

작은따옴표를 제거합니다. $rep를 꼭 인용해야 하는 경우(예를 들어 공백이 포함되어 있는 경우) 큰따옴표를 사용하세요.

files=`find "$rep" -type f`

큰따옴표 안에는 공백이 없습니다. "git"이 아닌 "git"을 검색하고 계시죠?

답변2

출력을 find변수에 저장하지 마십시오. 이는 신뢰할 수 없고 비효율적입니다. find출력 처리를 시작하기 전에 실행을 완료해야 하기 때문에 비효율적입니다 . 이는 대규모 디렉터리 트리에 영향을 미칩니다. 명령 구문이 정확하더라도 의 출력은 find줄 바꿈으로 구분된 파일 이름 목록으로 구성되므로 신뢰할 수 없습니다. 파일 이름에 개행 문자가 포함되어 있지 않은 것으로 알려져 있지 않으면 이는 모호합니다. 또한 출력을 올바르게 구문 분석하지 않습니다. 따옴표 없이 명령 대체를 사용하면 $(…)공백이 있을 때마다 명령 결과가 별도의 단어로 구분되고(단지 줄 바꿈이 아님) 해당 단어는 쉘 glob 패턴으로 해석됩니다. 이 처리를 피하려면 "$(…)"(변수 및 명령 대체 주위에 항상 큰따옴표: "$foo", "$(foo)")를 사용하십시오. 파일 이름을 분리해야 하기 때문에 여기서는 좋지 않습니다.

find생성된 파일을 처리하는 내장 함수인 -exec작업이 있습니다. 그걸 써. 그것이 바로 그 목적입니다.

find "$rep" -type f -exec echo {} \;

단일 명령이 아닌 각 파일에서 임의의 쉘 조각을 실행해야 하는 경우 쉘을 명령으로 호출하십시오. 잘못된 파일 이름을 방지하려면 해당 파일 이름을 셸에 인수로 전달하세요.

find "$rep" -type f -exec sh -c '
  echo "$0"
  # more shell commands ...
' {} \;

답변3

따옴표 제거

file=`'$rep' 찾기 -유형 f`

올바른 스크립트는

#!/bin/bash
담당자 = "git"

file=`$rep -type f 찾기`
${files}의 f에 대해;
    에코$f
완벽한

답변4

'앞뒤에 공백 추가-type

관련 정보