![Expansão do nome do arquivo para o script esperado no bash](https://rvso.com/image/76421/Expans%C3%A3o%20do%20nome%20do%20arquivo%20para%20o%20script%20esperado%20no%20bash.png)
Eu tenho o seguinte script bash com um script esperado incorporado:
#!/bin/bash
if [ ! $# == 2 ]
then
echo "Usage: $0 os_base_version sn_version"
exit
fi
if [ -e /some/file/path/$10AS_26x86_64_$2_*.bin ]
then
filename="/some/file/path/$10AS_26x86_64_$2_*.bin"
echo ${filename}
else
echo "install archive does not exist."
exit
fi
{
/usr/bin/expect << EOD
set timeout 20
spawn "${filename}"
expect {
"Press Enter to view the End User License Agreement" {
send "\r"
exp_continue
}
"More" {
send " "
exp_continue
}
"Do you accept the End User License Agreement?" {
send "y\r"
}
}
interact
expect eof
EOD
}
Na pasta estão vários arquivos no formato{x}0AS_26x86_64_{x.x.x}_{rev}.bin
Quando executo o script, obtenho o nome de arquivo correto no primeiro eco. Mas quando tento passar isso para o script esperado usando ${filename}
, a expansão do nome do arquivo desaparece.
Exemplo de saída:
# ./make.sh 2 1.2.3
/some/file/path/20AS_26x86_64_1.2.3_45678.bin
spawn /some/file/path/20AS_26x86_64_1.2.3_*.bin
couldn't execute "/some/file/path/20AS_26x86_64_1.2.3_*.bin": no such file or directory
while executing
"spawn /some/file/path/20AS_26x86_64_1.2.3_*.bin"
Como você pode ver, os $filename
shows estão corretos com o eco, mas não dentro da parte esperada.
Editar:
Basta executar o script com -x e parece que a variável filename nunca obtém a expansão completa do nome do arquivo, apenas o echo o faz.
# ./make.sh 2 1.2.3
+ '[' '!' 2 == 2 ']'
+ '[' -e /some/file/path/20AS_26x86_64_1.2.3_45678.bin ']'
+ filename='/some/file/path/20AS_26x86_64_1.2.3_*.bin'
+ echo /some/file/path/20AS_26x86_64_1.2.3_45678.bin
/some/file/path/20AS_26x86_64_1.2.3_45678.bin
+ exit
Responder1
Na verdade, você nunca atribui um nome de arquivo específico à variável. O que você está fazendo é definir a variável para um padrão glob. Então, quando você passa a variável para echo
, o padrão glob é expandido, então você vê o nome do seu arquivo impresso. No entanto, a variável nunca foi definida para um nome de arquivo específico.
Então, você precisa de uma maneira melhor de obter o nome do arquivo. Algo como:
#!/bin/bash
## Make globs that don't match anything expand to a null
## string instead of the glob itself
shopt -s nullglob
## Save the list of files in an array
files=( /some/file/path/$10AS_26x86_64_$2_*.bin )
## If the array is empty
if [ -z $files ]
then
echo "install archive does not exist."
exit
## If at least one file was found
else
## Take the first file
filename="${files[0]}"
echo "$filename"
fi
{
/usr/bin/expect << EOD
set timeout 20
spawn "${filename}"
expect {
"Press Enter to view the End User License Agreement" {
send "\r"
exp_continue
}
"More" {
send " "
exp_continue
}
"Do you accept the End User License Agreement?" {
send "y\r"
}
}
interact
expect eof
EOD
}