Bash使用正则表达式扩展文件名

时间:2020-09-30 09:43:18

标签: arrays bash

我对访问目录中的文件名有疑问。

#!/bin/bash
INPUT_DIR=/home/user/TestDir
files=$INPUT_DIR/*txt

echo $files

FileA.txt FileB.txt

但是这是什么样的物体?如果我使用数组语法访问

echo "${files[1]}"

返回的值为空。

2 个答案:

答案 0 :(得分:2)

首先,您拥有的不是正则表达式。 shell涉及*的扩展称为Filename Expansions,也称为“全局”扩展。

不是使用数组来保存内容,而是使用标量类型。当您将glob表达式分配给变量时,它是“字面意义上的”分配,并且当您使用echo进行无引号的扩展时,shell首先扩展变量,然后将glob扩展为其结果文件。但是请记住,默认情况下,变量为标量类型,它们只能包含一个值。对于多个值,您需要数组。

inputDir=/home/user/TestDir
files=( "$inputDir"/*txt)
printf '%s\n' "${files[@]}"

可以使用"${files[@]}"访问元素列表(此处的双引号很重要),而单个元素可以访问"${files[0]}"。但是,使用数组的东西不再支持POSIX,因为它们在这些Shell中受支持。

也不要在用户脚本中为变量名使用大写字母。大写的变量名具有特殊含义,仅供外壳程序使用。

答案 1 :(得分:0)

您的take(5)变量是字符串,而不是数组。

如果您希望文件成为数组,则必须编写

files