Retornando uma variável de uma função [closed]

1

Eu tenho o script Linux mostrado abaixo. Eu posso obtê-lo para retornar do método descriptografar nada que eu preciso descompactar um arquivo. O método decrypt envia uma string com o nome de um arquivo zip. Por favor, dê alguns conselhos. Menciono que outros métodos trazem corretamente os arquivos.

m_mode_verbose=1
const_1="ceva"
val="valoare"



decrypt ()
{

PASSPHRASE="xxxx"

encrypted=$1
local decrypt1='echo $encrypted | awk '{print substr($0,0,64)}''

echo "$PASSPHRASE"|gpg --no-tty --batch --passphrase-fd 0 --quiet --yes --decrypt -o ${sspTransferDir}/${decrypt1} ${sspTransferDir}/${encrypted} 2> /dev/null
if [ $? -eq 0 ]
then
notify "pgp decrypt of file.pgp succeeded"
else
notify "pgp decrypt of file.pgp failed"
fi


#   PASSPHRASE=”your passphrase used for PGP”
#   echo "$PASSPHRASE"|gpg --no-tty --batch --passphras
#e-fd 0 --quiet --yes \
#–decrypt -o file.dat file.pgp 2> /dev/null
#if [ $? -eq 0 ]
#then
#        echo "pgp decrypt of file.pgp succeeded"
#else
#        echo "pgp decrypt of file.pgp failed"
#fi
# echo "testtest $decrypt1"
echo "valoare ="$decrypt1


val=$decrypt1
#eval $decrypt1
$CONST=$decrypt1
echo "local"$CONST
}

process_file()
{
f=$1
echo "Processing $f"
for encrypted in 'cat $f'; do
        echo "Name of the file: "$i
        echo "Decrypted : " $decrypted
        decrypted=$(decrypt ${encrypted})   #decrypted = decrypt(encrypted)
         # decrypted=decrypt ${encrypted} ${decrypted}  #decrypted = decrypt(encrypted)
        echo "val ============== " $val
      echo "Decrypted after method" $decrypted
    unzip -o  ${TransferDir}/${decrypted} -d  ${ImportRoot}
        echo "Path after unzip" $ImportRoot
        #rm -f ${decrypted}
        echo "After remove" $decrypted
        path=${sspTransferDir}/${encrypted}
        #rm -f ${sspTransferDir}/${encrypted}
        echo "Path to remove" $path
        echo "Const ="$CONST
done

}


#main


get_config;
file="output$lang.txt"
echo "file is $file"
get_file_list $file # fills $file with the list of encrypted files corresponding to language $language
process_file $file  #process - decrypt,
    
por SocketM 22.07.2015 / 14:06

2 respostas

1

Para responder ao título da sua pergunta, as funções do shell geralmente retornam dados imprimindo-as no stdout. Os chamadores capturam o valor de retorno com retval="$(func "$arg1" "$arg2" "$@")" ou similar. A alternativa é passar o nome de uma variável para armazenar um valor em (com printf -v "$destvar" ).

Se o seu script não estiver funcionando, pode ser por problemas de citação. Você está perdendo citações em muitas expansões variáveis.

por exemplo,

echo "valoare ="$decrypt1
# should be:
echo "valoare =$decrypt1"

Sua versão cita a parte literal, mas deixa os dados do usuário abertos para interpretação pelo shell. Vários caracteres de espaço em branco em $decrypt1 são recolhidos em um único espaço na saída de echo .

    
por 22.07.2015 / 15:08
2

As funções do shell imitam subprocessos; como os subprocessos, seu valor de retorno é apenas um número de 8 bits, indicando convencionalmente sucesso (0) ou falha (diferente de zero). Para passar dados de uma função, armazene-os em uma variável. As variáveis não são locais para uma função, a menos que sejam declaradas assim.

decrypt () {
  …
  valoare="$decrypt1"
}

…
decrypt
decrypted="$valoare"

Note que não revi o seu script. É difícil ler com o recuo quebrado e nomes de variáveis que não parecem se relacionar com o que eles estão acostumados. Eu vejo alguns problemas potenciais óbvios: muitos comandos estão faltando aspas duplas em torno de substituições de variáveis. Sempre coloque aspas duplas na variável e substituições de comandos : "$val" , etc. Há também outros bits que não fazem sentido, como $CONST=$decrypt1 - para definir a variável CONST , remova o $ .

    
por 24.07.2015 / 02:38