mapfile
从标准输入读取行并赋值到数组。
概要
mapfile [-d delim] [-n count] [-O origin] [-s count] [-t] [-u fd] [-C callback] [-c quantum] [array]
主要用途
从标准输入或文件描述符读取行并赋值到数组。
选项
-d delim
: 将delim
设为行分隔符,代替默认的换行符。-n count
: 从标准输入中获取最多count
行,如果count
为零那么获取全部。-O origin
: 从数组下标为origin
的位置开始赋值,默认的下标为0。-s count
: 跳过对前count
行的读取。-t
: 读取时移除行分隔符delim
(默认为换行符)。-u fd
: 从文件描述符fd
中读取。-C callback
: 每当读取了quantum
行时,调用callback
语句。-c quantum
: 设定读取的行数为quantum
。
如果使用 -C
时没有同时使用 -c
指定 quantum
的值,那么 quantum
默认为5000。
当 callback
语句执行时,将数组下一个要赋值的下标以及读取的行作为额外的参数传递给 callback
语句。
如果使用 -O
时没有提供起始位置,那么 mapfile
会在实际赋值之前清空该数组。
参数
array
(可选):用于输出的数组名称。如果没有指定数组名称,那么会默认写入到变量名为 MAPFILE
的数组中。
返回值
返回成功除非使用了非法选项、指定的数组是只读的、指定的数组不是下标数组。
例子
代码语言:javascript复制# 常见的读取形式。
mapfile < source_file target_array
cat source_file |mapfile target_array
mapfile -u fd target_array
# 只读取前5行。
mapfile < source_file -n 5 target_array
# 跳过前5行。
mapfile < source_file -s 5 target_array
# 在数组指定的下标开始赋值。
# 请注意:这样做不会清空该数组。
mapfile < source_file -O 2 target_array
# 读取时设定行分隔符为tab。
# 注意,第二行的tab在终端需要用ctrl v tab输入;
mapfile < source_file -d $'t' target_array
mapfile < source_file -d ' ' target_array
# 读取时移除行分隔符(tab)。
mapfile < source_file -d $'t' -t target_array
# 读取时移除行分隔符(换行符)。
mapfile < source_file -t target_array
# 每读取2行,执行一次语句(在这里是echo)。
mapfile < source_file -C "echo CALLBACK:" -c 2 target_array
# 遍历下标,依次显示数组的元素。
for i in ${!target_array[@]}; do
printf "%s" ${target_array[i]}
done
注意:
该命令是bash内建命令,相关的帮助信息请查看 help
命令。
bash内建命令 readarray
是 mapfile
的同义词。
tempfile
shell中给临时文件命名
补充说明
有时候在写Shell脚本的时候需要一些临时存储数据的才做,最适合存储临时文件数据的位置就是/tmp
,因为该目录中所有的内容在系统重启后就会被清空。下面是两种方法为临时数据生成标准的文件名。
tempfile
命令
tempfile
命令只有在基于Debian的发行版中才默认自带,比如Ubuntu,其他发行版没有这个命令。
用 tempfile
命令为一个临时文件命名:
temp_file_name=$(tempfile)
用一个加带了随机数的文件名作为临时文件命名:
代码语言:javascript复制temp_file_name="/tmp/file_$RANDOM"
$RANDOM
是一个返回随机数的环境变量。
$$
变量
如果没有 tempfile
命令的Linux发行版,也可以使用自己的临时文件名:
temp_file_name="/tmp/file.$$"
作为添加的后缀会被扩展成当前运行脚本的进程id。