'는 디렉터리입니다 ' 함수

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

  • Hmmm …. bash man 페이지에 따르면. … bash의 return 내장 명령은 문자열 매개 변수 유형이 아닌 EXIT 코드 (정수)를 반환하는 데 사용됩니다.
  • find "${directory}" -mindepth 1 -type d -name "${wildcard}" -print0 | xargs -0 doStuff
  • googlers :이 오류 메시지를 얻을 수있는 또 다른 훌륭한 소스 ge는 #a correct bash line comment

Answer

iv 대신 //a wrong bash line comment입니다. class = “answer”>

인용문 및 명령 대체가 여기서 문제입니다.

실행중인 특정 문제는 셸이 환경 변수 stuff=doStuff.
정말로 원하는 것은 (올바르게 해석하는 경우) doStuff$i 값을 인수로 사용하여 출력을 stuff 변수에 할당합니다. 이를 수행하는 방법은 $()에 명령을 래핑하는 것입니다. 예를 들면 다음과 같습니다.

stuff="$(doStuff "$i")" 

어떻게 모든 것을 따옴표로 묶었는지 알아 봅니다. 이것은 쉘이 단어 분할을 원하지 않는 것을 단어 분할하는 것을 방지하기위한 것입니다 (/foo/bar baz의 단일 인수를 /foo/barbaz).

또한 함수의 출력은 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는 명령입니다. 다음 두 링크를 읽어 보시기 바랍니다.

당신이 가지고있는 것과 유사한 작동 버전

doStuff () { echo "$1/hello" } stuff=$(doStuff "$i") 

답변

오류를 제공하는 줄은 예상대로 작동하지 않습니다.

먼저 환경 변수 stuff를 문자열 “doStuff”로 설정 한 다음 $ {i}를 명령으로 실행하려고합니다. 그리고 $ {i}는 디렉토리이므로 주어진 오류 메시지와 함께 실패합니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다