#!/bin/bash
# Declare array
declare -a ARRAY
# Link filedescriptor 10 with stdin
exec 10<&0
# stdin replaced with a file supplied as a first argument
exec < $1
let count=0
while read LINE; do
ARRAY[$count]=$LINE
((count++))
done
echo Number of elements: ${#ARRAY[@]}
# echo array's content
echo ${ARRAY[@]}
# restore stdin from filedescriptor 10
# and close filedescriptor 10
exec 0<&10 10<&-
5行(exec 10<&0
)と7行()exec < $1
は何をしますか?
答え1
4行と6行のコメントがすべてを教えてくれます。ファイル記述子10には標準入力(任意)が割り当てられ、最初の引数として名前が付けられたファイルの内容がstdinに割り当てられます。
ファイルの末尾でこの操作はキャンセルされます。
スクリプト開発者は、これは次のフォームが呼び出されないと思うかもしれません。
echo -e '5\n6' | yourscript
(引数なしで)スクリプトが標準入力から読み取ることを防ぎますが、そうではありません(つまり、出力は次のようになります)。
yourscript: line 7: $1: ambiguous redirect
Number of elements: 2
5 6