5

例:

#!/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()か?

4

4 に答える 4

4

シェル関数は数値を返すことができます。'f'と't'ではなく0と1を考慮してください

#!/bin/sh

a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}

a
r=$?
echo $r

ls -1 a*これにより、おそらくまだ破棄したいからの出力が書き込まれますが、の値はr0または1のいずれかになり、出力は含まれません。

行またはブロック全体からの出力をリダイレクトする他の例は優れており、他の人が示唆しているように、条件をテストする他の方法を知る必要があります(ただし、これlsは一種の任意の例であると想定していました)

于 2010-07-09T01:01:40.783 に答える
1

lsで始まるファイルをチェックするために使用する必要はありませんa。シェルをそのまま使う

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}
于 2010-06-29T11:44:46.287 に答える
1

コマンドのリストにリダイレクトを追加できます。

{
  コマンド1
  コマンド2
} >/開発/null

スクリプトのある時点で、後続のコマンドからの出力が必要ない場合は、シェルの出力をexecビルトインでリダイレクトできます。

エコー興味深い
exec >/dev/null
退屈なエコー

これは、関数の最後までではなく、スクリプトの最後まで続くことに注意してください。これは、興味深いコマンドの後のコマンドを処理しますが、前のコマンドは処理しません。

exec /dev/nullファイル記述子の操作を使用して、 の効果を元に戻す方法があります。ただし、実際に実行するのは難しい場合があるため、必ずしもお勧めしません。アイデアは、標準出力に接続されているものを別の記述子に再配置し、次に標準出力を別のファイルにリダイレクトし、最後に元の標準出力を標準出力に再配置することです。

{
  exec 3>&1 # fd 3 を fd 1 に複製 (標準出力)
  exec >/dev/null # 標準出力を /dev/null に接続
  退屈なエコー
  exec 1>&3 # 標準出力を fd 3 に保存されたものに接続します
  エコー興味深い
  exec >/dev/null # 標準出力を /dev/null に再度接続
  より退屈なエコー
} 3>/dev/null # ブレース付きリストには fd 3 がどこかに接続されている必要があります。
                    # 実際には何も書き込まれませんが。
于 2010-07-08T23:26:15.737 に答える
0
a() { 
ls -1 a*  > /dev/null
[ "$?" == "0" ] && echo t  || echo f

} 

r=`a` 
echo $r 

[-ffilename]やその他のファイルテストの使用も検討してください。

于 2010-06-29T11:13:00.127 に答える