find는 -path 또는 -iregex와 같은 문자열 변수의 공백을 처리할 수 없습니다.

find는 -path 또는 -iregex와 같은 문자열 변수의 공백을 처리할 수 없습니다.

-path 또는 -iregex 찾기 옵션의 문자열 변수에는 공백이 있을 수 없습니다.
이 입력은 '/home/demo.*/\.config/File System/.*t$'
다음에 공급됩니다.

read i


m="-iregex $i"
find ~ $m

변수가 아닌 상수이면 작동하지 않으므로
아니요 , 올바른 해결책은 무엇입니까?find ~ \'$m\'eval find ~ \'$m\'

답변1

데이터가 포함된 문자열 변수에 연산을 넣지 마십시오(참조:배쉬 FAQ 50). 변수를 사용할 때는 항상 큰따옴표를 사용하세요.

i='/home/demo.*/\.config/File System/.*t$'
find ~ -iregex "$i"

-iregex비어 있지 않은 경우 고유한 항목을 포함하려면 $i다음과 같이 할 수 있습니다. 유지하되 정규식을 다음으로 바꾸십시오 .*(예: 무엇이든).

find ~ -iregex "${i-.*}"

bash(그러나 아님 ) sh과 같은 배열을 이해하는 쉘을 사용하는 경우 -iregex필요할 때만 포함하도록 쉘을 사용할 수 있습니다.

IFS= read -r i

findRegex=()
[[ -n "$i" ]] && findRegex=('-iregex' "$i")

find ~ "${findRegex[@]}"

여기서 무슨 일이 일어나고 있는지 보려면 읽기 및 검색을 수정 하거나 find도움 이 될 수도 있습니다.echo findman bashArrays@

read i또한 로 변경했습니다 IFS= read -r i. 이렇게 하면 셸이 입력 데이터를 구문 분석하지 못하게 되어 $IFS여러 공백(정확히 말하면 문자) 및 기타 문자 조합이 포함된 표현식이 깨질 수 있습니다.

관련 정보