Preciso de ajuda usando uma declaração if then elif para atribuição de variável opcional

-2

Eu postei algum tempo atrás um velho script bash MPV que eu encontrei na net e eu estava tentando modificá-lo. Bem, eu ainda estou nisso. A questão aqui é que estou tentando usar uma instrução if then elif para designar file="$ f", file="$ filename" ou fazer eco de uma instrução de erro e sair se não houver arquivos. file="$ filename" e o trabalho de echo / exit. no entanto file="$ f" apenas faz o primeiro arquivo. o precedente para o loop do faz encontrar todos os arquivos enquanto faz um loop através de $ dir, mas não passa o novo nome do arquivo para o resto do script quando o próximo loop é iniciado.

"$ f" é um arquivo em loop em um loop que a maioria do script está em. mas não parece afetar file="$ filename" de qualquer forma.

Eu tentei uma declaração de caso, mas não consegui fazer isso funcionar. código:

#!/bin/bash -x



while getopts ":d:f:s:i:n:g:v:" opt; do
  case $opt in
d)
  declare -r  location="$OPTARG"
  ;;
f)
  declare -r filename="$OPTARG"
  ;;
s)
  declare -r startFrame="$OPTARG"
  ;;
i)
  declare -r intervalScreenshots="$OPTARG"
  ;;
n)
  declare -r numberScreenshots="$OPTARG"
  ;;
g) 
  declare -r videoHeight="$OPTARG"
  ;;
v)
  declare -r verbose="TRUE"
  ;;
\?)
  echo "Invalid option: -$OPTARG" >&2
  exit 1
  ;;
:)
  echo "Option -$OPTARG requires an argument." >&2
  exit 1
  ;;
  esac
done

if [[ -z "$location" ]] ; then
 declare -r dir="."
else
   declare -r dir="$location"
 fi
for f in "$dir"/*.*

do

if [[ -z "$filename" ]] ; 

then

declare -r file="$f"

elif [[ -f "$filename" ]] ;

then

declare -r file="$filename"
else

echo "No Files Found"
exit

fi

mkdir "$(basename "$file" | cut -d "." -f1)"
#start mpv

mpv --pause --quiet --no-osc --no-audio --osd-level=0  --no-border --vo=opengl --framedrop=no --scaler-lut-size=8 --scale=spline36 --cscale=spline36 --opengl-fbo-format=rgb16 --linear-scaling --geometry="$videoHeight" --screenshot-template=%F_%ws --screenshot-format=png --screenshot-png-compression=5 --screenshot-directory="$(basename "$file" | cut -d "." -f1)" "$file" --input-ipc-server=/tmp/mpvsocket  > /dev/null 2>&1 &


# Informations grabbing
#declare -r filename="$(basename "${file}" )"

 sleep 1

 declare -r lastFrame="$(echo '{ "command": ["get_property", "estimated-frame-count"]}' | socat - /tmp/mpvsocket | cut -d":" -f2 | cut -d , -f1)" 

 sleep 1

 declare -r fpsVideo="$(echo '{ "command": ["get_property", "estimated-vf-fps"]}' | socat - /tmp/mpvsocket | cut -d":" -f2 | cut -d , -f1)"


 sleep 1

# Declare interval for each screenshot
if [[ -z "$intervalScreenshots" ]] ; then
  declare diffFrame="$(awk "BEGIN {printf $lastFrame - $startFrame}")"
  declare intervalFrame="$(awk "BEGIN {printf $diffFrame / $numberScreenshots}")"

else
  declare -r intervalFrame="$intervalScreenshots"
fi

# Looping to take screenshots
declare currentFrame="$startFrame"
for i in $(seq 1 "$numberScreenshots") ; do

   declare currentTime="$(awk "BEGIN {printf $currentFrame / $fpsVideo}")"

  if [[ -n "$verbose" ]] ; then
    printf 'Filename: %s\n\n' "$filename"

    printf 'Current time: %.2f\n\n' "$currentTime"

    printf 'Last frame: %s\n' "$lastFrame"
    printf 'FPS: %s\n' "$fpsVideo"
    printf 'Interval: %s\n' "$intervalFrame"
    printf 'Screenshot: %02d\n\n\n' "$i"

 fi
  # Debug line



   echo '{ "command": ["set_property", "pause", true] }'    | socat - /tmp/mpvsocket

   sleep 1

   echo '{ "command": ["seek", '$currentTime', "absolute" ] }' | socat - /tmp/mpvsocket

   sleep 1

   echo '{ "command": ["screenshot", "window"] }' | socat - /tmp/mpvsocket

   sleep 1



currentFrame="$(awk "BEGIN {printf $currentFrame+$intervalFrame}")"



done

echo '{ "command": ["quit"] }'  | socat - /tmp/mpvsocket

done
    
por wisperer 30.04.2017 / 06:38

1 resposta

0

Resumindo, eu não percebi que declarar -r fez com que minha variável não fosse alterada em loops posteriores. Graças ao steeldiver por apontar que o nosso. Não havia realmente nenhum ponto em fazê-lo ler apenas em primeiro lugar. Eu só fiz isso por consistência depois de usar para depurar algumas funções matemáticas antigas (long gone) BC.

    
por wisperer 30.04.2017 / 09:19