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

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

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

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

#!/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 called followed 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. この質問が実際に行うこととその理由を説明すると、この質問に正確に答える方が簡単です。

おすすめ記事