나는 단지 심볼릭 링크를 생성하기 위한 스크립트를 작성하고 있는데 행이 너무 많아서 배열을 훨씬 더 적게 사용할 수 있다고 생각하지만 배열에 여러 경로를 넣는 것을 설명하는 예제를 찾지 못했습니다.
내가 작성한 코드는 다음과 같습니다.
#!/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
노트:
배열에 정의된 예제 파일 이름은
files
실제로 큰따옴표로 묶을 필요가 없지만 공백과 기타 귀찮은 문자는 파일 이름에서 유효한 문자이므로 그렇게 하는 것이 좋습니다.중괄호는 다음과 같습니다.아니요참조 변수를 대체합니다. 이는 변수 이름을 명확하게 하는 데에만 사용됩니다. 예를 들어 var _x`
"$var_x"
라는 변수를var_x
참조 합니다. 중괄호를 사용해야 하는지 여부에 관계없이 변수를 인용해야 합니다."${var}_x" is referring to a variable called
followed by the literal string
그러나 배열 변수를 사용할 때는 중괄호가 필요합니다(예:
for Enlace in "${files[@]}"
줄에 표시된 대로). 그리고 쉘 매개변수 확장을 사용할 때."$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
또한 스크립트 중간 어딘가에서 디렉토리를 변경하는 것으로 보입니다. 이는 디렉터리를 변경할 때마다 적절한 값으로 배열을 재정의
files
하거나 배열의 해시와 같은 더 복잡한 데이터 구조일 수 있음을 의미할 수 있습니다(이 경우에는perl
대신bash
해시를 사용합니다. 키는 디렉터리와 배열 요소는 생성될 심볼릭 링크의 이름입니다.이 질문이 실제로 수행하는 작업과 그 이유를 설명하면 이 질문에 정확하게 대답하는 것이 더 쉽습니다.
답변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"