Como mostro os resultados encontrados em uma declaração if then?

1

Então, o que estou tentando fazer é procurar um conjunto de arquivos e fazer com que ele repita quais os que encontrou. Por exemplo, é isso que eu tenho

    #!/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

Então, isso vai me dizer se ele pode encontrar algum deles, mas não vai me dizer qual deles está encontrando. Eu criei outro com elif declarações dentro, o que funciona mais ou menos, mas se ele encontrar o primeiro, ele pára por aí e não vai me dizer se os outros estão lá também. Então, espero que isso faça sentido, estou apenas tentando encontrar uma maneira de exibir quais arquivos foram encontrados.

    
por Ohitsspencer 03.08.2016 / 14:46

3 respostas

3

Você precisa dividir seu teste if em vários

if [ -f "$LaunchDaemon" ]
then
  echo $LaunchDaemon found
elif [ -f "$launchAgent" ]
then
  echo $launchAgent found
elif [ ... 
  ...
else
  echo Not found
fi

tipo estrutura (preencha os espaços em branco).

Se você quiser encontrar todas as correspondências, faça isso como vários testes, definindo uma variável para ver se algo foi encontrado ou não

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

Agora, às vezes, queremos definir uma variável para saber qual delas foi encontrada. Isso é comum quando se tenta encontrar um programa ou arquivo correspondente (por exemplo, nos velhos tempos, poderíamos ter /usr/lib/sendmail ou /usr/sbin/sendmail dependendo da distribuição do sistema operacional, então precisaríamos pesquisar para encontrá-lo).

found=
for f in "$LaunchDaemon" "$launchAgent" "$mobileLaunchDaemon" "$mobileAgent"
do
  [[ -f "$f" ]] && found="$f"
done

Agora temos $found apontando para uma entrada encontrada e podemos testar isso.

if [ -n "$found" ]
then
  echo Found: $found
else
  echo Nothing found
fi

O segundo loop também pode encontrar todas versões com uma pequena alteração:

found=
for f in "$LaunchDaemon" "$launchAgent" "$mobileLaunchDaemon" "$mobileAgent"
do
  [[ -f "$f" ]] && found="$found $f"
done

A desvantagem disso é que pode haver um espaço à frente, então devemos remover isso:

found="${found# }"
    
por 03.08.2016 / 15:07
1

Uma matriz seria a melhor abordagem aqui

#!/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
    
por 03.08.2016 / 15:15
0

tente isso

#!/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
    
por 03.01.2017 / 16:13