bash 스크립트에서 find를 사용하여 와일드 카드로 폴더 이름을 가져옵니다.
for i in $(find ${directory} -mindepth 1 -type d -name ${wildcard}); do stuff=doStuff ${i} done doStuff() { echo ${1} return ${1}"/hello"; }
문제는이 작업을 수행하면 다음 오류 ($ {i}는 “home / me / my_directory”에 해당함) :
line 111: "/home/me/my_directory": is a directory.
(111 번째 줄은 “doStuff “)
이 작업을 시도했지만 아무 소용이 없습니다.
for i in $(find ${directory} -mindepth 1 -type d -name ${wildcard}); do stuff=doStuff "${i}" done
분명히 프로그램이 디렉토리에 있지만 조작 할 수있는 문자열로 작성하고 싶습니다.
Comments
Answer
iv 대신 //a wrong bash line comment
입니다. class = “answer”>
인용문 및 명령 대체가 여기서 문제입니다.
실행중인 특정 문제는 셸이 환경 변수 stuff=doStuff
.
정말로 원하는 것은 (올바르게 해석하는 경우) doStuff
를 $i
값을 인수로 사용하여 출력을 stuff
변수에 할당합니다. 이를 수행하는 방법은 $()
에 명령을 래핑하는 것입니다. 예를 들면 다음과 같습니다.
stuff="$(doStuff "$i")"
어떻게 모든 것을 따옴표로 묶었는지 알아 봅니다. 이것은 쉘이 단어 분할을 원하지 않는 것을 단어 분할하는 것을 방지하기위한 것입니다 (/foo/bar baz
의 단일 인수를 /foo/bar
및 baz
).
또한 함수의 출력은 return
.
더 많은 따옴표를 사용해야하므로 다른 모든 항목에도 추가해야합니다. 다음은 스크립트의 전체 버전입니다.
doStuff() { echo "${1}" >&2 printf "%s/hello" "$1"; } IFS=$"\n" for i in $(find "${directory}" -mindepth 1 -type d -name "${wildcard}"); do stuff="$(doStuff "${i}")" done
사용하기 전에 함수 정의를 입력해야합니다. 쉘은 컴파일 된 프로그램처럼 파싱되지 않으며 파일을 여러 번 통과합니다.
또한 doStuff
를 수정하여 echo
를 STDERR로 보내 터미널에 표시 한 다음 printf
가 STDOUT으로 전송하여 변수
.
디렉토리에 줄 바꿈이 포함 된 경우 여전히 문제가 발생합니다. 그러나 이것은 셸의 제한입니다. 파일 경로의 유일한 문자는 contain은 NULL 문자 (\0
)입니다. 그러나 bash 및 기타 쉘은 문자열에 NULL 문자를 저장할 수 없습니다 (모두는 아니지만 여러 개입니다. zsh가 가능하다는 것을 알고 있습니다). t 구분자로 사용합니다.
댓글
- 앞 / 뒤에 공백이있는 경우 추가하고 싶을뿐입니다.
=
, 그것은 엉망입니다. 예 : MY_VAR = ' / some / path '는 유효하지만 MY_VAR = ' / some / 경로 ' 또는 MY_VAR = ' / some / path '는 그렇지 않습니다.
답변
좋은 노력이지만 작성하려고 시도하고 있음을 보여줍니다. bash
마치 프로그래밍 언어 인 것처럼 실제로는 단순한 스크립팅 언어입니다. stuff=doStuff arg
구성의 문제는 bash
가 의미하는 바를 의미하지 않는다는 것입니다. bash
에서 stuff=doStuff
는 변수 할당이고 arg
는 명령입니다. 다음 두 링크를 읽어 보시기 바랍니다.
- 반환 값 및 / 또는 명령의 출력을 변수에 저장하려면 어떻게해야합니까?
- 함수에서 문자열 (또는 큰 숫자 또는 음수)을 반환하려면 어떻게해야합니까? “return”을 사용하면 0에서 255까지의 숫자 만 제공 할 수 있습니다.
당신이 가지고있는 것과 유사한 작동 버전
doStuff () { echo "$1/hello" } stuff=$(doStuff "$i")
답변
오류를 제공하는 줄은 예상대로 작동하지 않습니다.
먼저 환경 변수 stuff를 문자열 “doStuff”로 설정 한 다음 $ {i}를 명령으로 실행하려고합니다. 그리고 $ {i}는 디렉토리이므로 주어진 오류 메시지와 함께 실패합니다.
find "${directory}" -mindepth 1 -type d -name "${wildcard}" -print0 | xargs -0 doStuff
#a correct bash line comment