シェルスクリプト関数から単一の値を返します
-
01-10-2019 - |
質問
例:
#!/bin/sh
a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}
r=`a`
echo $r
$r
含む t
また f
しかし、の出力も ls
指図。
私は書くかもしれません ls -1 a* >/dev/null 2>/dev/null
, 、しかし、エラーにつながる可能性のあるより複雑なスクリプトがある場合。
から単一の値を返す方法はありますか a()
?
解決
シェル関数は数値を返すことができます。 「f」と「t」ではなく0と1を考慮してください
#!/bin/sh
a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}
a
r=$?
echo $r
これは、から出力を書き留めます ls -1 a*
あなたはおそらくまだ処分したいのですが、 r
0または1のいずれかになり、出力は含まれません。
ラインまたはブロック全体からのリダイレクト出力の他の例は良いものであり、他の人が示唆したように、条件をテストする他の方法を知る必要があります(しかし、私は ls
任意の例でした)
他のヒント
使用する必要はありません ls
最初のファイルを確認します a
. 。シェルを使用するだけです
a() {
shopt -s nullglob
ret="f"
for file in a*
do
ret="t"
break
done
echo "$ret"
}
コマンドのリストにリダイレクトを置くことができます。
{ command1 command2 } >/dev/null
スクリプトのある時点で、後続のコマンドから出力が必要ない場合は、シェルの出力を次のようにリダイレクトできます。 exec
ビルトイン:
echo interesting exec >/dev/null echo boring
これは、関数の終了だけでなく、スクリプトの終了まで続くことに注意してください。これは、興味深いコマンドの後ではなく、コマンドの世話をします。
の効果を元に戻す方法があります exec /dev/null
, 、ファイル記述子の操作を使用します。実際に運動するのが難しいかもしれないので、私は必ずしもそれをお勧めしません。アイデアは、標準出力に接続されているものを別の記述子に再配置し、標準出力を別のファイルにリダイレクトし、最終的に元の標準出力を標準出力に戻すことです。
{ exec 3>&1 # duplicate fd 3 to fd 1 (standard output) exec >/dev/null # connect standard output to /dev/null echo boring exec 1>&3 # connect standard output back to what was saved in fd 3 echo interesting exec >/dev/null # connect standard output to /dev/null again echo more boring } 3>/dev/null # The braced list must have its fd 3 connected somewhere, # even though nothing will actually be written to it.
a() {
ls -1 a* > /dev/null
[ "$?" == "0" ] && echo t || echo f
}
r=`a`
echo $r
-f Filename]およびその他のファイルテストを使用することを検討してください。