関数で配列を参照するには、コマンドラインに配列名を渡します。

関数で配列を参照するには、コマンドラインに配列名を渡します。

通常、コピー/貼り付けが必要ないくつかの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
}

一般に、同様の機能が複数ある場合は、それらを1つの機能にまとめたいと思います。そのため、パラメータ配列を使用し、配列に基づいて同じことを行う関数を作成しました。

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"

関連情報