이 스크립트에서 오류는 어디에 있습니까?
#!/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