我正在尝试创建一个文件名的数组,这样我就可以对一个大文件进行排序,并只获取我想要的文件。我的脚本看起来像这样的set STATIONS = Kanto-station-names,其中的文件夹“Kanto-station-name”包含我想要的文件名。紧随其后的是myarr=($(awk '{print $1}') $STATIONS),但是终端立即进入一个看起来更像工作文档的子subshell,其中的命令不起作用,我也不能退出。有什么建议吗?
发布于 2016-06-17 01:41:04
为什么不使用find命令创建一个数组来获取文件名列表呢?
例如:
#!/bin/bash
IFS=$'\n'
MyArr=($(find /location/to/Kanto-station-names/ -type f -print0 | xargs -0 ls))
echo ${MyArr[@]}
echo ${MyArr[1}
echo ${MyArr[2}
echo ${MyArr[3} 发布于 2016-06-17 01:42:52
您的问题很难理解,但如果您只想将关东-station-names目录中的所有文件名组成一个数组,这应该是可行的(请注意,前导的'$‘是一个提示符,而不是您应该键入的内容):
$ myArray=()
$ for FILE in `ls Kanto-station-names` ; do myArray+=($FILE) ; done在此之后,您可以访问数组元素:
$ echo ${myArray[0]}
$ echo ${myArray[1]}要查看数组的所有元素,请执行以下操作:
$ echo ${myArray[@]}发布于 2017-05-11 23:12:16
#!/usr/bin/env bash
# cause globs to expand to an empty list if no matches exist
shopt -s nullglob
# Use a glob expression to populate the array
stations=( Kanto-station-names/* )
(( ${#stations[@]} )) || {
echo "ERROR: No stations exist (make sure Kanto-station-names contains files)" >&2
exit 1
}
## read into an array (bash 4.0 or newer)
#readarray -t myarr < <(awk '{print $1}' "${stations[@]}")
# read into an array (bash 3.x-compatible)
IFS=$'\n' read -r -d '' -a myarr < <(awk '{print $1}' "${stations[@]}" && printf '\0') || {
echo "Error extracting first column from station list" >&2
exit 1
}
# print definition of our populated array as output
declare -p myarr注意事项:
ls。所有文件名列表的生成都是通过globbing执行的。请参见Why you shouldn't parse the output of ls(1)."${stations[@]}"在运行awk的进程替换中展开,因此名称将传递给awk --这是原始代码中的错误之一。readarray代码无法检测到awk中的失败退出状态。使用bash4.4或更高版本,您可以通过运行wait "$!" || { echo "Process failed" >&2; }或类似程序来检测进程替换何时失败--在此之前,无法检测到进程替换的退出状态,因此,即使使用bash4.0到4.3,也有充分的理由使用与bash3.x兼容的方法。https://stackoverflow.com/questions/37865790
复制相似问题