私は単にシンボリックリンクを生成するためのスクリプトを書いていますが、行が多すぎて配列をはるかに少なく使用できると思いますが、配列に複数のパスを置くことを説明する例を見つけることができませんでした。
私が書いたコードは次のとおりです。
#!/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"