我应该如何更改它以使用数组?

我应该如何更改它以使用数组?

我只是编写一个用于创建符号链接的脚本,但我认为我有太多的行可以用数组少得多,但我没有找到一个示例来解释在数组中放置多个路径。

我写的代码是这样的:

#!/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" is referring to a variable calledvar followed by the literal string_x`。无论是否需要使用花括号,您仍然需要引用变量。

    但是,使用数组变量时需要大括号(例如,如for Enlace in "${files[@]}"行中所示)。以及使用shell参数扩展时。

  3. @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
  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"

相关内容