for + 배열 + 매개변수

for + 배열 + 매개변수

for 루프에 문제가 있습니다. 이것이 제가 원하는 것입니다.

for arg
do
array[index]=(`find $arg -type l -maxdepth $depth -printf "%p\n" `)
 index++
done
fi

arg- 위치 매개변수, 디렉토리에만 해당

이 루프는 매개변수를 살펴보고 심볼릭 링크를 찾습니다. 저는 심볼릭 링크를 배열에 저장하고 싶습니다. 하나의 디렉터리만 사용하여 스크립트를 실행하면 제대로 작동하지만 두 개 이상의 디렉터리를 입력하면 작동하지 않습니다. 도움이 필요하세요?

저는 다음과 같이 일하고 싶습니다. 예를 들면 다음과 같습니다.

두 개의 매개변수가 있으며 각 매개변수는 디렉터리입니다.

루프는 먼저 인수를 첫 번째 디렉터리로 설정한 다음 배열이 심볼릭 링크로 채워집니다. 예를 들어 2개의 심볼릭 링크를 찾으므로 array[0] array[1]이 해당 링크가 되고 두 번째 인수로 계속되어야 합니다. 예를 들어 array[2] array[3] array[4]로 설정해야 하는 3개의 심볼릭 링크가 있습니다.

답변1

ksh93다차원 배열(또는 배열의 배열) 없이 OR bash(및 GNU ) 에 대해 이야기하는 경우 find다음을 수행할 수 있습니다.

index=0 IFS=$'\n'
set -f
for arg do
  eval "array_$index"'=($(find "$arg" -type l -maxdepth "$depth" -print))'
  ((index++))
done

다른 배열 을 호출하려면 array_0...array_1

(위에서는 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다.)

모든 링크를 하나의 배열로 결합하려면 다음을 수행하십시오.

IFS=$'\n'
set -f
array=($(find "$@" -type l -maxdepth "$depth" -print))

그 정도면 충분합니다.

셸에서 배열이나 루프를 사용하는 것은 일반적으로 올바른 방식으로 문제에 접근하고 있지 않음을 나타냅니다.

예를 들어, 찾고 싶다면가장 깊은귀하의 의견에서 알 수 있듯이 심볼릭 링크하려면 다음을 수행하십시오.

find "$@" -type l -print | awk -F/ '
   NF > n {deepest = $0; n=NF}
   END {print "Deepest:", deepest}'

awk텍스트를 처리하고 배열을 사용하는 데 있어 셸보다 더 효율적입니다. 이를 위해 설계되었습니다. 셸( bash모든 셸 중에서 효율성이 가장 낮은 것 중 하나)에서는 그렇지 않습니다. 쉘은 명령(예: awk또는 find)을 실행하는 데 능숙합니다. 이것이 바로 쉘이 설계된 이유입니다.

관련 정보