Bash

從函式返回一個變數

  • October 18, 2015

我有如下所示的 Linux 腳本。我可以讓它從方法中返回,我不需要解壓縮文件。方法 decrypt 發送一個帶有 zip 文件名稱的字元串。請給一些建議。我提到了另一種方法,它正確地帶來了文件。

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,

為了回答您的問題的標題,shell 函式通常通過將數據列印到標準輸出來返回數據。呼叫者擷取與retval="$(func "$arg1" "$arg2" "$@")"或類似的返回值。另一種方法是將變數的名稱傳遞給它以將值儲存在 (with printf -v "$destvar") 中。

如果您的腳本不起作用,則可能是由於引用問題。您缺少很多變數擴展的引號。

例如

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

您的版本引用了文字部分,但隨後將使用者數據打開以供 shell 解釋。輸出中的多個空白字元$decrypt1折疊為單個空格echo

Shell 函式模仿子程序;與子程序一樣,它們的返回值只是一個 8 位數字,通常表示成功(0)或失敗(非零)。要將數據傳遞出函式,請將其儲存在變數中。除非聲明為局部變數,否則變數不是函式的局部變數。

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

…
decrypt
decrypted="$valoare"

請注意,我尚未查看您的腳本。使用損壞的縮進和似乎與它們的用途無關的變數名稱很難閱讀。我確實看到了一些明顯的潛在問題:許多命令在變數替換周圍缺少雙引號。始終在變數和命令替換周圍加上雙引號:"$val"等。還有其他一些沒有意義的位,例如$CONST=$decrypt1— 設置變數CONST,刪除$.

引用自:https://unix.stackexchange.com/questions/217600