Em uma conexão remota do Putty, estou tentando ler um arquivo linha por linha, cortar cada linha por delimitador (";") e executar um comando se as variáveis satisfizerem uma condição. No entanto, recebo "identificador inválido" ao ler o arquivo.
Apenas alguma lógica simples no arquivo test.sh:
while read download.archive
do
likes = $(echo cut -d ";" -f 1 $line)
echo $likes
dislikes = $(echo cut -d ";" -f 2 $line)
dislikes = $((dislikes * 95))
url = $(echo cut -d ";" -f 3 $line)
if [$likes -gt $dislikes]
then
youtube-dl --config-location youtube-dl-3.conf url
fi
done < download.archive
O arquivo download.archive é o seguinte:
9873;354;https://www.youtube.com/watch?v=0fd56CGnVRU
3267;54;https://www.youtube.com/watch?v=Mq4jAwPdCMw
25411;871;https://www.youtube.com/watch?v=PcSBOUpgngM
2829;44;https://www.youtube.com/watch?v=S-rj8m7Ssow
921;303;https://www.youtube.com/watch?v=JchVQMuxRVA
2014;32;https://www.youtube.com/watch?v=H8Y_ZfNViPU
No entanto, quando tento executar ./test.sh, recebo "./test.sh: line 4: read: 'download.archive': not a valid identifier"
. Se o arquivo for válido, por que está gerando um erro?
Responder1
Depois de vários erros, aqui está o código funcional:
while IFS= read -r line; do
likes=$(cut -d ";" -f 1 <<< "$line")
dislikes=$(cut -d ";" -f 2 <<< "$line")
likes=$((likes / 50))
url=$(cut -d ";" -f 3 <<< "$line")
if [ $likes -gt $dislikes ]
then
youtube-dl --config-location youtube-dl-3.conf $url
fi
done < download.archive
A primeira linha do comando "read" é sempre igual à anterior (readlinha), e o arquivo a ser lido está após a instrução "done" no final (done <baixar.arquivo).Esta postagem aquiexplica as adições IFS
e -r
e o que elas fazem.
Ao atribuir variáveis, acho que você não pode colocar um espaço entre as atribuições. Como tal, isso não funciona
likes = $(cut -d ";" -f 1 $line)
Mas isso faz:
likes=$(cut -d ";" -f 1 $line)
...Exceto que, para nos referirmos à linha que o programa está lendo no momento, devemos usar <<<
. Assim:
likes=$(cut -d ";" -f 1 <<< $line)
Por último, ao verificar uma condição (na if
instrução), é necessário haver um espaço entre os colchetes inicial e final, e a condição dentro, assim -
if [ $likes -gt $dislikes ]
Para nos referirmos à variável url
que contém nosso URL do youtube-dl, nos referimos às variáveis usando um arquivo $
. Assim:
$url