読者です 読者をやめる 読者になる 読者になる

サブシェル内部の変数を参照しようとして失敗する例とその対策

6つのランダム値を作成し、その中の最大値を得るというスクリプトの例

失敗例
#!/bin/bash

# このシェルでランダムな値を6つ作成して、パイプラインで while 文に渡し、
# while 文内部で最大数を取得する。
printf "%s\n" ${RANDOM}{,,,,,} |
  while read num
  do
    [ $num -gt ${biggest:=0} ] && biggest=$num
  done

# 最大数を表示しようとするが、パイプラインの先はサブシェル内で実行されるため、
# サブシェル内で格納された結果をこのシェルで参照することはできない。
printf "The largest number is: %d\n" "$biggest"

結果

The largest number is: 0
リダイレクトを利用した例
#!/bin/bash

# サブシェルでランダムな値を6つ作成して、このシェルの while 文にデータをリダイレクトする。
while read num
 do
 [ $num -gt ${biggest:=0} ] && biggest=$num
 done < <(printf "%s\n" ${RANDOM}{,,,,,})

# while 文はこのシェルで実行されるので、結果をこのシェルで参照することができる。
printf "The largest number is: %d\n" "$biggest"

結果例

The largest number is: 26815
リダイレクトを利用しない例
#!/bin/bash

for num in ${RANDOM}{,,,,,}
 do
 [ $num -gt ${biggest:=0} ] && biggest=$num
 done

printf "The largest number is: %d\n" "$biggest"

結果例

The largest number is: 32654