簡體   English   中英

bash:將列表文件放入一個變量中,但數組的大小為 1

[英]bash: put list files into a variable and but size of array is 1

我在一個目錄中列出文件並循環遍歷它們,但我也需要知道有多少。 ${#dirlist[@]} 總是 1,但是 for 循環有效嗎?

#!/bin/bash
prefix="xxx"; # as example

len=${#prefix}; # string length
dirlist=`ls ${prefix}*.text`;
qty=${#dirlist[@]};  # sizeof array is always 1
for filelist in $dirlist
do
    substring="${filelist:$len:-5}";
    echo "${substring}/${qty}";
done

我有文件 xxx001.text 到 xxx013.text
但我得到的只是 001/1 002/1 003/1

這:

dirlist=`ls ${prefix}*.text`

不做數組。 它只生成一個以空格分隔的文件名的字符串。

你所要做的

dirlist=(`ls ${prefix}*.text`)

使它成為一個數組。

然后$dirlist將只引用第一個元素,所以你必須使用

${dirlist[*]}

在循環中引用所有這些。

除非用( )包圍它,否則您不會創建數組:

dirlist=(`ls ${prefix}*.text`)
dir=/tmp
file_count=`ls -B "$dir" | wc -l`
echo File count: $file_count

聲明一個文件數組:

arr=(~/myDir/*)

使用計數器遍歷數組:

for ((i=0; i < ${#arr[@]}; i++)); do

  # [do something to each element of array]

  echo "${arr[$i]}"
done

bash數組語法很簡單,使用括號()

# string
var=name

# NOT array of 3 elements
# delimiter is space ' ' not ,
arr=(one,two,three) 
echo ${#arr[@]}
1

# with space
arr=(one two three)
# or ' ',
arr=(one, two, three)
echo ${#arr[@]}
3

# brace expansion works as well
# 10 elements
arr=({0..9})
echo ${#arr[@]}
10

# advanced one
curly_flags=(--{ftp,ssl,dns,http,email,fc,fmp,fr,fl,dc,domain,help});
echo ${curly_flags[@]}
--ftp --ssl --dns --http --email --fc --fmp --fr --fl --dc --domain --help
echo ${#curly_flags[@]}
12

如果要運行命令並存儲輸出

# a string of output
arr=$(ls)
echo ${#arr[@]}
1

# wrapping with parentheses
arr=($(ls))
echo ${#arr[@]}
256

更高級/更方便的方法是使用內置的bash 命令mapfilereadarray進程替換 這是使用mapfile的示例:

# read the output of ls, save it in the array name: my_arr
# -t    Remove a trailing DELIM from each line read (default newline)
mapfile -t my_arr < <(ls)
echo ${#my_arr[@]}
256

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM