首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何修复我的bash数组?

如何修复我的bash数组?
EN

Stack Overflow用户
提问于 2016-06-17 01:30:04
回答 3查看 76关注 0票数 0

我正在尝试创建一个文件名的数组,这样我就可以对一个大文件进行排序,并只获取我想要的文件。我的脚本看起来像这样的set STATIONS = Kanto-station-names,其中的文件夹“Kanto-station-name”包含我想要的文件名。紧随其后的是myarr=($(awk '{print $1}') $STATIONS),但是终端立即进入一个看起来更像工作文档的子subshell,其中的命令不起作用,我也不能退出。有什么建议吗?

EN

回答 3

Stack Overflow用户

发布于 2016-06-17 01:41:04

为什么不使用find命令创建一个数组来获取文件名列表呢?

例如:

代码语言:javascript
复制
#!/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} 
票数 0
EN

Stack Overflow用户

发布于 2016-06-17 01:42:52

您的问题很难理解,但如果您只想将关东-station-names目录中的所有文件名组成一个数组,这应该是可行的(请注意,前导的'$‘是一个提示符,而不是您应该键入的内容):

代码语言:javascript
复制
$ myArray=()
$ for FILE in `ls Kanto-station-names` ; do myArray+=($FILE) ; done

在此之后,您可以访问数组元素:

代码语言:javascript
复制
$ echo ${myArray[0]}
$ echo ${myArray[1]}

要查看数组的所有元素,请执行以下操作:

代码语言:javascript
复制
$ echo ${myArray[@]}
票数 0
EN

Stack Overflow用户

发布于 2017-05-11 23:12:16

代码语言:javascript
复制
#!/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 --这是原始代码中的错误之一。
  • bash4.0的注释掉替代选项中的readarray代码无法检测到awk中的失败退出状态。使用bash4.4或更高版本,您可以通过运行wait "$!" || { echo "Process failed" >&2; }或类似程序来检测进程替换何时失败--在此之前,无法检测到进程替换的退出状态,因此,即使使用bash4.0到4.3,也有充分的理由使用与bash3.x兼容的方法。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37865790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档