【linux命令讲解大全】010. mapfile命令和tempfile命令的用法及示例

2024-03-02 11:24:34 浏览数 (1)

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内建命令 readarraymapfile 的同义词。

tempfile

shell中给临时文件命名

补充说明

有时候在写Shell脚本的时候需要一些临时存储数据的才做,最适合存储临时文件数据的位置就是/tmp,因为该目录中所有的内容在系统重启后就会被清空。下面是两种方法为临时数据生成标准的文件名。

tempfile 命令

tempfile 命令只有在基于Debian的发行版中才默认自带,比如Ubuntu,其他发行版没有这个命令。

tempfile 命令为一个临时文件命名:

代码语言:javascript复制
temp_file_name=$(tempfile)

用一个加带了随机数的文件名作为临时文件命名:

代码语言:javascript复制
temp_file_name="/tmp/file_$RANDOM"

$RANDOM 是一个返回随机数的环境变量。

$$ 变量

如果没有 tempfile 命令的Linux发行版,也可以使用自己的临时文件名:

代码语言:javascript复制
temp_file_name="/tmp/file.$$"
是系统预定义变量,显示当前所在进程的进程号,用 .

作为添加的后缀会被扩展成当前运行脚本的进程id。

0 人点赞