배열을 사용하려면 어떻게 변경해야 하나요?

배열을 사용하려면 어떻게 변경해야 하나요?

나는 단지 심볼릭 링크를 생성하기 위한 스크립트를 작성하고 있는데 행이 너무 많아서 배열을 훨씬 더 적게 사용할 수 있다고 생각하지만 배열에 여러 경로를 넣는 것을 설명하는 예제를 찾지 못했습니다.

내가 작성한 코드는 다음과 같습니다.

#!/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"

관련 정보