我只是编写一个用于创建符号链接的脚本,但我认为我有太多的行可以用数组少得多,但我没有找到一个示例来解释在数组中放置多个路径。
我写的代码是这样的:
#!/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" is referring to a variable called
varfollowed by the literal string
_x`。无论是否需要使用花括号,您仍然需要引用变量。但是,使用数组变量时需要大括号(例如,如
for Enlace in "${files[@]}"
行中所示)。以及使用shell参数扩展时。@muru 指出,有时代码符号链接
"$PWD"
,有时它符号链接"$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"