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