だから私がしたいのは、ファイルセットを見つけて、見つかったファイルをエコーすることです。たとえば、これが私が持っているものです。
#!/bin/bash
LaunchDaemon="LaunchDaemon.plist"
launchAgent="LaunchAgent"
mobileLaunchDaemon="MobileDaemon.plist"
mobileAgent="MobileAgent"
if [ -f "$LaunchDaemon" ] || [ -f "$launchAgent" ] || [ -f "$mobileLaunchDaemon" ] || [ -f "$mobileAgent" ]
then
echo "<result>Found</result>"
else
echo "<result>Not Found</result>"
fi
だから、これはそのうちの1つを見つけることができるかどうかを教えてくれますが、何を探しているのかわかりません。そのステートメントを含む別のステートメントを作成してelif
動作しますが、最初のステートメントを見つけると、そこで停止し、他のステートメントもあるかどうかを知らせません。したがって、これが意味があることを願っています。私はどのファイルが見つかったかを表示する方法を見つけようとしています。
答え1
if
テストを複数に分割する必要があります。
if [ -f "$LaunchDaemon" ]
then
echo $LaunchDaemon found
elif [ -f "$launchAgent" ]
then
echo $launchAgent found
elif [ ...
...
else
echo Not found
fi
構造を入力してください。 (空白は直接記入してください。)
一致するものをすべて見つけるには、複数のテストで実行し、変数を設定して見つかったものがあるかどうかを確認してください。
found=0
if [ -f "$LaunchDaemon" ]
then
echo $LaunchDaemon found
found=1
fi
if [ -f "$launchAgent" ]
then
echo $launchAgent found
found=1
fi
...
if [ $found == 0 ]
then
echo Not found
fi
今では、どの変数が見つかったのかを知るために変数を設定したい場合があります。これは、一致するプログラムまたはファイルを検索しようとしたときによく発生します(たとえば、以前はオペレーティングシステムのディストリビューションがあるか、それに依存していた可能性があるため、それを見つける/usr/lib/sendmail
ため/usr/sbin/sendmail
に検索する必要がありました)。
found=
for f in "$LaunchDaemon" "$launchAgent" "$mobileLaunchDaemon" "$mobileAgent"
do
[[ -f "$f" ]] && found="$f"
done
これで$found
見つかった項目を指定してテストできます。
if [ -n "$found" ]
then
echo Found: $found
else
echo Nothing found
fi
2番目のループも見つけることができますみんなマイナーな変更があるバージョン:
found=
for f in "$LaunchDaemon" "$launchAgent" "$mobileLaunchDaemon" "$mobileAgent"
do
[[ -f "$f" ]] && found="$found $f"
done
これの欠点は、前にスペースがある可能性があるため、それらを削除する必要があることです。
found="${found# }"
答え2
ここでは配列が最善のアプローチです。
#!/bin/bash
#Store the filenames in an array, also less management overhead
arry=( "LaunchDaemon.plist" "LaunchAgent" "MobileDaemon.plist" "MobileAgent" )
#Optioinally if you wish to add one more file to check you could
#uncomment the below line
#arry+=("$1") #One more file added from the command line
for i in "${arry[@]}" #Iterate through each element using a for loop
do
if [ -f "$i" ]
then
echo "<result> $i Found</result>"
else
echo "<result> $i Not Found</result>"
fi
done
答え3
この試み
#!/bin/bash
search_LaunchDaemon="LaunchDaemon.plist"
search_launchAgent="LaunchAgent"
search_mobileLaunchDaemon="MobileDaemon.plist"
for filex in ${!search_*}
do
found=${!filex}
#echo -e "${filex}=${!filex}"
#we remove the prefix "search_"
IFS="_" read part1 part2 <<< "${filex}"
if [[ -f $found ]];
then
echo "I have found ${part2}"
else
echo "${part2} not found!"
fi
done