配列を使用するにはどうすればよいですか?

配列を使用するにはどうすればよいですか?

私は単にシンボリックリンクを生成するためのスクリプトを書いていますが、行が多すぎて配列をはるかに少なく使用できると思いますが、配列に複数のパスを置くことを説明する例を見つけることができませんでした。

私が書いたコードは次のとおりです。

#!/usr/bin/env bash

echo '
Autor ----------------> Inukaze ( Venezuela )
Sitio ----------------> https://goo.gl/ij6WqW
Correo-E -------------> [email protected]
Licencia -------------> GPL 2

******* Inicio : Acerca de este Guión ********
  
  Es un guion simple para enlazar las partidas
  y configuraciones del emulador PPSSPP
  
******** Fin : Acerca de este Guión **********'

#Phantasy Star Portable 2
cd "./PhantasyStarPortable2"

#Version EUR (PAL)
Enlace="../../memstick/PSP/SAVEDATA/ULES01439"
if [ -L ${Enlace} ] ; then
   if [ -e ${Enlace} ] ; then
      echo "Enlace Funcional"
   else
      echo "Enlace Roto"
   fi
elif [ -e ${Enlace} ] ; then
   echo "No es un Enlace"
else
   echo "No existe"
ln -s "$PWD"    "$Enlace"   
fi

Enlace="../../memstick/PSP/SYSTEM/ULES01439_ppsspp.ini"
if [ -L ${Enlace} ] ; then
   if [ -e ${Enlace} ] ; then
      echo "Enlace Funcional"
   else
      echo "Enlace Roto"
   fi
elif [ -e ${Enlace} ] ; then
   echo "No es un Enlace"
else
   echo "No existe"
ln -s "$PWD/PSP2Conf.ini"   "$Enlace"
fi

#Version USA (NTSC)
Enlace="../../memstick/PSP/SAVEDATA/ULUS10529"
if [ -L ${Enlace} ] ; then
   if [ -e ${Enlace} ] ; then
      echo "Enlace Funcional"
   else
      echo "Enlace Roto"
   fi
elif [ -e ${Enlace} ] ; then
   echo "No es un Enlace"
else
   echo "No existe"
ln -s "$PWD" "$Enlace"  
fi

Enlace="../../memstick/PSP/SYSTEM/ULUS10529_ppsspp.ini"
if [ -L ${Enlace} ] ; then
   if [ -e ${Enlace} ] ; then
      echo "Enlace Funcional"
   else
      echo "Enlace Roto"
   fi
elif [ -e ${Enlace} ] ; then
   echo "No es un Enlace"
else
   echo "No existe"
ln -s "$PWD/PSP2Conf.ini"   "$Enlace"
fi
cd ..

#Monster Hunter Freedom Unite (1)
cd "./MonsterHunterFreedomUnite1"

#Version USA (NTSC)
Enlace= "../../memstick/PSP/SAVEDATA/ULUS10391"
if [ -L ${Enlace} ] ; then
   if [ -e ${Enlace} ] ; then
      echo "Enlace Funcional"
   else
      echo "Enlace Roto"
   fi
elif [ -e ${Enlace} ] ; then
   echo "No es un Enlace"
else
   echo "No existe"
ln -s "$PWD" "$Enlace"  
fi

Enlace="../../memstick/PSP/SYSTEM/ULUS10391_ppsspp.ini"
if [ -L ${Enlace} ] ; then
   if [ -e ${Enlace} ] ; then
      echo "Enlace Funcional"
   else
      echo "Enlace Roto"
   fi
elif [ -e ${Enlace} ] ; then
   echo "No es un Enlace"
else
   echo "No existe"
ln -s "$PWD" "$Enlace"
fi

#Version EUR (PAL)
Enlace="../../memstick/PSP/SAVEDATA/ULES01213"
if [ -L ${Enlace} ] ; then
   if [ -e ${Enlace} ] ; then
      echo "Enlace Funcional"
   else
      echo "Enlace Roto"
   fi
elif [ -e ${Enlace} ] ; then
   echo "No es un Enlace"
else
   echo "No existe"
ln -s "$PWD" "$Enlace"
fi

Enlace="../../memstick/PSP/SYSTEM/ULES01213_ppsspp.ini"
if [ -L ${Enlace} ] ; then
   if [ -e ${Enlace} ] ; then
      echo "Enlace Funcional"
   else
      echo "Enlace Roto"
   fi
elif [ -e ${Enlace} ] ; then
   echo "No es un Enlace"
else
   echo "No existe"
ln -s "$PWD" "$Enlace"
fi
cd ..

まあ、ただ配列を使って行数を減らしたいので、不要な行をたくさん書いたようです。フォルダへのシンボリックリンクを作成し、別のフォルダ内のファイルへのシンボリックリンクを自分で作成したいと思います。

答え1

これは、ファイル名パラメータが異なる同じコードの複数のコピーであるようです。お分かりのように、これはfor配列とループで置き換えることができ、置き換える必要があります。このような:

files=("../../memstick/PSP/SAVEDATA/ULES01439"
       "../../memstick/PSP/SYSTEM/ULES01439_ppsspp.ini"
       "../../memstick/PSP/SAVEDATA/ULUS10529"
       "../../memstick/PSP/SYSTEM/ULUS10529_ppsspp.ini"
       "../../memstick/PSP/SAVEDATA/ULUS10391"
       "../../memstick/PSP/SYSTEM/ULUS10391_ppsspp.ini"
       "../../memstick/PSP/SAVEDATA/ULES01213"
       "../../memstick/PSP/SYSTEM/ULES01213_ppsspp.ini")

for Enlace in "${files[@]}" ; do
  if [ -L "$Enlace" ] ; then
    if [ -e "$Enlace" ] ; then
      echo "Enlace Funcional"
    else
      echo "Enlace Roto"
    fi
  elif [ -e "$Enlace" ] ; then
    echo "No es un Enlace"
  else
    echo "No existe"
    ln -s "$PWD" "$Enlace"   
  fi
done

メモ:

  1. 配列で定義されているサンプルファイル名はfiles実際に二重引用符で囲む必要はありませんが、スペースやその他の面倒な文字はファイル名で有効な文字なので、そうすることをお勧めします。

  2. 中かっこは次のとおりです。いいえ参照変数を置き換えます。これは変数名を明確にするためにのみ使用されます。たとえば、var _x`"$var_x"という変数をvar_x参照してください。中かっこを使用するかどうかに関係なく、変数を引用する必要があります。"${var}_x" is referring to a variable calledfollowed by the literal string

    ただし、配列変数を使用する場合は中括弧が必要です(for Enlace in "${files[@]}"行に示すように)。そしてシェルパラメータ拡張を使用するとき。

  3. "$PWD"@muruは時々コードシンボリックリンクを使用し、時にはシンボリックリンクを使用すると指摘しました。"$PWD/PSP2Conf.ini"

    実際に何をしているのか言うのは難しいですが、決定的な要因は「$ Enlace」が「$ Enlace」で終わるかどうかです.ini。この場合、ln -s "$PWD" "$Enlace"その行を次に置き換えます。

    if [[ $Enlace =~ \.ini$ ]] ; then 
      ln -s "$PWD/PSP2Conf.ini" "$Enlace"
    else
      ln -s "$PWD" "$Enlace"   
    fi
  1. また、スクリプトの中間のどこかでディレクトリを変更しているようです。これは、ディレクトリを変更するたびに適切な値で配列をオーバーライドするfilesか、配列のハッシュなどのより複雑なデータ構造である可能性があります(この場合はperl代わりにbashハッシュを使用します。キーはディレクトリと配列要素を生成します。シンボリックリンクの名前です。

  2. この質問が実際に行うこととその理由を説明すると、この質問に正確に答える方が簡単です。

答え2

これは一般的なプログラミングに関するものですが、繰り返すには関数が必要だと言いたいです。

make_link() {
    Enlace=$2
    file=$1
    if [ -L "${Enlace}" ] ; then
       if [ -e "${Enlace}" ] ; then
          echo "Enlace Funcional"
       else
          echo "Enlace Roto"
       fi
    elif [ -e "${Enlace}" ] ; then
       echo "No es un Enlace"
    else
       echo "No existe"
       ln -s "$PWD"    "$Enlace"   
    fi
}
make_link "$PWD"              "../../memstick/PSP/SAVEDATA/ULES01439"
make_link "$PWD/PSP2Conf.ini" "../../memstick/PSP/SYSTEM/ULES01439_ppsspp.ini"
...

これが設定されている場合は、上記のハードコーディングされたリストの代わりに配列などを使用してデータを保持できます。ここではランタイム評価が必要ですが、それほど$PWD単純ではありません。

答え3

スクリプト全体には何の利点もありません。

-f(強制)または-b(バックアップ)を追加しないと、「ファイルがありますln -s」エラーで失敗するため、単に実行して失敗するようにしてください。

enlace="../../memstick/PSP/SAVEDATA/ULES01439"
ln -s "$PWD" "$enlace"

ファイル形式に関する追加情報が必要な場合(存在する場合)、file "$enlace"次のように追加できます。

ln -s "$PWD" "$enlace" || file "$enlace"

関連情報