関数から変数を返す[閉じる]

関数から変数を返す[閉じる]

以下のように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,

答え1

シェル関数は子プロセスを模倣します。子プロセスと同様に、戻り値は通常成功(0)または失敗(ゼロではない)を表す8桁の数字です。関数からデータを渡すには、そのデータを変数に保存します。変数は、そう宣言されない限り、関数にローカルではありません。

decrypt () {
  valoare="$decrypt1"
}

decrypt
decrypted="$valoare"

まだあなたのスクリプトを確認していません。壊れたインデントと目的とは全く関係がないように見える変数名のため、読みにくいです。いくつかの明らかな潜在的な問題があります。多くのコマンドで変数置換に二重引用符がありません。変数とコマンドの置換には常に二重引用符を使用してください。"$val"待つ。$CONST=$decrypt1変数の設定CONST、削除など、理解できない他の部分があります$

答え2

質問のタイトルに答えるために、シェル関数は通常、データをstdoutとして印刷して返します。呼び出し側キャプチャ戻り値retval="$(func "$arg1" "$arg2" "$@")"はまたはに似ています。別の方法は、(を使用して)値を格納する変数の名前を渡すことですprintf -v "$destvar"

スクリプトが機能しない場合は、参照の問題が原因である可能性があります。多くの変数拡張の引用符がありません。

例えば

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

あなたのバージョンではリテラル部分を引用していますが、シェルで解釈できるようにユーザーデータを開いたままにしておきます。出力の複数の空白文字は$decrypt1単一の空白に縮小されます。echo

関連情報