50

Linux の非常に基本的なコマンドをいくつか知っており、いくつかのスクリプトを作成しようとしています。5 桁の数値の下 2 桁の合計を評価する関数を作成しました。関数は、この結果の合計を最後の 2 桁の間で連結し、それを返す必要があります。この値を返す理由は、この値を他の関数で使用するためです。

例: 12345 の場合、関数は 4+5 を計算して 495 を返します。

#!/bin/bash

set -x
echo "enter: "
        read input

function password_formula
{
        length=${#input}
        last_two=${input:length-2:length}
        first=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $2}'`
        second=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $1}'`
        let sum=$first+$second
        sum_len=${#sum}
        echo $second
        echo $sum

        if [ $sum -gt 9 ]
        then
               sum=${sum:1}
        fi

        value=$second$sum$first
        return $value
}
result=$(password_formula)
echo $result

エコーして結果を確認しようとしていますが、以下に示すような出力が得られます。

-bash-3.2$ ./file2.sh 
+++ password_formula
+++ echo 'enter: '
+++ read input
12385
+++ length=8
+++ last_two=85
++++ echo 85
++++ sed -e 's/\(.\)/\1 /g'
++++ awk '{print $2}'
+++ first=5
++++ echo 85
++++ sed -e 's/\(.\)/\1 /g'
++++ awk '{print $1}'
+++ second=8
+++ let sum=5+8
+++ sum_len=2
+++ echo 5
+++ echo 8
+++ echo 13
+++ '[' 13 -gt 9 ']'
+++ sum=3
+++ value=835
+++ return 835
++ result='enter: 
5
8
13'
++ echo enter: 5 8 13
enter: 5 8 13

また、結果を次のように印刷しようとしました。

password_formula
RESULT=$?
echo $RESULT

しかし、それは未知の価値を与えています:

++ RESULT=67
++ echo 67
67

正しい値を適切に保存し、(再確認するために) 画面に表示するにはどうすればよいですか?

前もって感謝します。

4

7 に答える 7

33

戻り値 (別名終了コード) は、0 から 255 までの範囲の値です。情報を返すためではなく、成功または失敗を示すために使用されます。この範囲外の値はラップされます。

番号などの情報を返すには、次を使用します

echo "$value"

キャプチャしたくない追加情報を印刷するには、次を使用します。

echo "my irrelevant info" >&2 

最後に、それをキャプチャするには、行ったことを使用します。

 result=$(password_formula)

言い換えると:

echo "enter: "
        read input

password_formula()
{
        length=${#input}
        last_two=${input:length-2:length}
        first=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $2}'`
        second=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $1}'`
        let sum=$first+$second
        sum_len=${#sum}
        echo $second >&2
        echo $sum >&2

        if [ $sum -gt 9 ]
        then
               sum=${sum:1}
        fi

        value=$second$sum$first
        echo $value
}
result=$(password_formula)
echo "The value is $result"
于 2013-02-21T22:37:51.853 に答える
13

返す必要がある値をエコーし​​て、以下のようにキャプチャするのは簡単です

demofunc(){
    local variable="hellow"
    echo $variable    
}

val=$(demofunc)
echo $val
于 2017-01-05T07:16:03.930 に答える
4

上記の答えは、データを返すのではなく、データをエコーするように関数を変更して、キャプチャできるようにすることを提案しています。

戻り値を変数に保存する必要がある場所 ( 0/1 の成功値を返すtest/など)を変更できない関数またはプログラムの場合、コマンド置換内でエコーします。[$?

# Test if we're remote.
isRemote="$(test -z "$REMOTE_ADDR"; echo $?)"
# Or:
isRemote="$([ -z "$REMOTE_ADDR" ]; echo $?)"

# Additionally you may want to reverse the 0 (success) / 1 (error) values
# for your own sanity, using arithmetic expansion:
remoteAddrIsEmpty="$([ -z "$REMOTE_ADDR" ]; echo $((1-$?)))"

例えば

$ echo $REMOTE_ADDR

$ test -z "$REMOTE_ADDR"; echo $?
0
$ REMOTE_ADDR=127.0.0.1
$ test -z "$REMOTE_ADDR"; echo $?
1
$ retval="$(test -z "$REMOTE_ADDR"; echo $?)"; echo $retval
1
$ unset REMOTE_ADDR
$ retval="$(test -z "$REMOTE_ADDR"; echo $?)"; echo $retval
0

データを出力するが、保存する戻り値も持つプログラムの場合、戻り値は出力とは別にキャプチャされます。

# Two different files, 1 and 2.
$ cat 1
1
$ cat 2
2
$ diffs="$(cmp 1 2)"
$ haveDiffs=$?
$ echo "Have differences? [$haveDiffs] Diffs: [$diffs]"
Have differences? [1] Diffs: [1 2 differ: char 1, line 1]
$ diffs="$(cmp 1 1)"
$ haveDiffs=$?
$ echo "Have differences? [$haveDiffs] Diffs: [$diffs]"
Have differences? [0] Diffs: []

# Or again, if you just want a success variable, reverse with arithmetic expansion:
$ cmp -s 1 2; filesAreIdentical=$((1-$?))
$ echo $filesAreIdentical
0
于 2015-08-06T16:42:03.017 に答える
1

それはecho声明によるものです。エコーをプリントに切り替えて、で戻ることができますecho。以下の作品

#!/bin/bash

set -x
echo "enter: "
read input

function password_formula
{
        length=${#input}
        last_two=${input:length-2:length}
        first=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $2}'`
        second=`echo $last_two| sed -e 's/\(.\)/\1 /g'|awk '{print $1}'`
        let sum=$first+$second
        sum_len=${#sum}
        print $second
        print $sum

        if [ $sum -gt 9 ]
        then
           sum=${sum:1}
        fi

        value=$second$sum$first
        echo $value
}
result=$(password_formula)
echo $result
于 2013-02-21T22:43:01.713 に答える