Estou escrevendo meu primeiro código no bash. Estou preso a partir de 2 horas. Este é o meu código:
#!/bin/bash
declare -i l=0
declare -i d=0
declare -i s1=0
declare -i s2=0
declare -i t=0
declare -i o=0
declare -i p=0
for i in demo_room/subject_1/?*
do
if [ "${i:0:1}" = "l" ];
then
((l++));
echo "l=$l"
python motempl_n.py $i $l
elif [ "${i:0:1}" = "d" ];
then
((d++));
echo "d=$d"
python motempl_n.py $i $d
elif [ "${i:0:1}" = "o" ];
then
o=$((o+1));
echo "o=$o"
python motempl_n.py $i $o
elif [ "${i:0:1}" = "p" ];
then
p=$((p+1));
python motempl_n.py $i $p
elif [ "${i:0:1}" = "t" ];
then
t=$((t+1));
python motempl_n.py $i $t
elif [ "${i:0:7}" = "slide_1" ];
then
s1=$((s1+1));
python motempl_n.py $i $s1
#elif [ "${i:0:7}" == 'slide_2' ]
else
s2=$((s2+1));
python motempl_n.py $i $s2
fi
done
Então eu estou tendo uma pasta demo_room/subject_1
. Nesta pasta tenho 140 vídeos avi seus nomes são:
20 vídeos têm nome: dislike_01
paradislike_20
20 vídeos têm nome: like_01
paralike_20
20 vídeos têm nome: ok_01
paraok_20
20 vídeos têm nome: point_01
parapoint_20
20 vídeos têm nome: slide_1_01
paraslide_1_20
20 vídeos têm nome: slide_2_01
paraslide_2_20
20 vídeos têm nome: take_a_picture_01
paratake_a_picture_1_20
O que eu quero fazer é primeiro encontrar a classe do vídeo de entrada e depois dar sua ocorrência como entrada para o arquivo python. Os primeiros 20 vídeos da subject_1
pasta são dislike
um, então esse código funciona bem, mas o 21º vídeo é like_01
, mas o parâmetro que ele passa para o código python é 21.
Mas deve ser 1 porque este é o primeiro vídeo da classe como no loop for. E cada vez que imprime o valor de $d
. Significa cada vez que vai em 2º if condition
. No código python posso verificar se o nome do vídeo é like_01
mas o segundo valor passado é 21
. Por quê? Isso acontece para todos os 140 vídeos.
Seu
$i
conterá o caminho completo (demo_room/subject_1/file
), então sempre começará comd
.Você poderia fazer algo como:
Onde
${i##*/}
está$i
com a correspondência da parte principal*/
removida.Observe também que as expansões de parâmetros precisam ser citadas em sh/bash:
Embora seu código esteja bem escrito, há muita duplicação. Aqui está uma versão mais condensada:
Estou usando uma matriz associativa em vez de variáveis inteiras distintas, mas felizmente o bash aritmético lida com
(( an_unset_variable++ ))
graça e atribui "1" à variável.Observe que
?
no seu?*
era redundante, pois os nomes dos arquivos sempre contêm pelo menos um caractere, portanto, não há arquivo que*
(0 ou mais caracteres) corresponda e?*
(1 ou mais caracteres) não.Sua
$i
variável sempre começa com umd
:demo_room … …
Você precisa extrair o nome do arquivo. E já que estamos extraindo, podemos extrair tanto o nome quanto o número do arquivo.
Assim, uma versão mais curta do seu script pode ser:
Este script usa apenas uma variável de array
count
, a lista de chaves (automaticamente) usadas (de$name
) é impressa no final do script.Comente a
echo \
linha quando gostar de como o script funciona para realmente executar os comandos.