함수에서 배열을 참조하려면 명령줄에 배열 이름을 전달하세요.

함수에서 배열을 참조하려면 명령줄에 배열 이름을 전달하세요.

일반적으로 복사-붙여넣기가 필요한 일부 adb 명령을 빠르게 실행할 수 있도록 bash_profile을 업데이트하여 bash에 대해 자세히 알아보려고 합니다. 나는 모두 다음과 같은 유사한 함수를 많이 만들고 있다는 것을 발견했습니다.

function andVid() {
  minInputs=0
  fileName="$(filNamInc $MEDIA_DIR/Videos/aaaAndroidVideo mp4)"
  origCmd="adb shell screenrecord --time-limit 60 /sdcard/screenrecord.mp4; sleep 3; adb pull /sdcard/screenrecord.mp4 $fileName"
  cmd="$(andAddSer $minInputs "$origCmd" "$@")"
  echo "Use ctrl+c to stop recording"
  eval $cmd
}

일반적으로 비슷한 기능이 여러 개 있으면 이를 하나의 기능으로 결합하려고 합니다. 그래서 매개변수 배열을 사용하고 배열을 기반으로 동일한 작업을 수행하는 함수를 만들었습니다.

andVid=(4 'adb shell screenrecord --time-limit 60 /sdcard/screenrecord.mp4; sleep 3; adb pull /sdcard/screenrecord.mp4' '/Videos/aaaAndroidVideo' 'mp4')

function adbRnr() {
  minInputs=$1
  cmd=$2
  if (( $# > 3 )); then
    fileTarget=$3
    fileExtension=$4
    fileName="$(filNamInc $MEDIA_DIR$fileTarget $fileExtension)"
    cmd="$cmd $fileName"
  fi
  if (( $# > $minInputs )); then
    cmd="${cmd:0:4} -s ${@: -1} ${cmd:4}"
  fi
  eval $cmd

(참고: 첫 번째 함수에서 andAddSer가 수행하는 작업을 여기에서 볼 수 있습니다.) 이는 함수를 실행하려면 다음과 같은 명령줄 항목을 사용해야 함을 의미합니다.

adbRnr "${andVid[@]}"

타이핑 속도가 느리고 기억하기 어렵습니다. 차라리 배열의 이름을 입력한 다음 함수에서 전체 "${[@]}" 부분을 수행하여 명령줄 입력이 다음과 같이 보이도록 하고 싶습니다.

adbRnr andVid

그러나... 배열 이름을 전달하는 것은 심각한 문제임이 입증되었습니다. 나는 "!"를 사용하여 거의 모든 호출 매개변수 조합을 시도했지만 성공하지 못했습니다. 예:

andVid=(4 'adb shell screenrecord --time-limit 60 /sdcard/screenrecord.mp4; sleep 3; adb pull /sdcard/screenrecord.mp4' '/Videos/aaaAndroidVideo' 'mp4')

function arrayParser() {
  echo "${andVid[*]}"    # echos as expected
  echo $#                # echos "1" as expected
  param=$1               
  echo $param            # echos "andVid" as expected
  cmd=("${!param[3]}")
  echo $cmd              # expected "mp4", nothing printed
}

arrayParser andVid

Bash의 함수에 배열을 전달할 수 없다는 것을 알고 있지만 제가 참조하는 배열은 이미 구성 파일의 일부입니다. 매개변수를 사용하여 배열을 참조하는 방법은 무엇입니까?

답변1

함수에서 이름으로 변수를 참조합니다.

arrayParser () {
    declare -n arr="$1"

    printf 'Array: %s\n' "${arr[*]}"
    printf 'Array element at index 3: %s\n' "${arr[3]}"
}

myarray=( alpha beta gamma "bumbling bee" )
arrayParser myarray

함수 내에서 이름 참조 변수에 대한 참조는 arr해당 변수에 대한 참조를 함수의 첫 번째 인수로 전달합니다.

이름 참조 변수는 bash버전 4.3에서 도입되었습니다.

답변2

이 같은:

andVid=(4 'adb shell screenrecord --time-limit 60 /sdcard/screenrecord.mp4; sleep 3; adb pull /sdcard/screenrecord.mp4' '/Videos/aaaAndroidVideo' 'mp4')

param=andVid
cmd="\${$param[3]}"
eval echo "$cmd"

관련 정보