#!/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