Bash 使用shell脚本将文件名存储在数组中

Bash 使用shell脚本将文件名存储在数组中,bash,shell,Bash,Shell,我想将以f-开头的文件名存储在一个数组中。上面的代码不起作用 编辑: 我得到以下错误 #!/bin/bash i=0 ls f-* | while read m do #echo $m arr[$i]=$m i=$((i+1)) done EDITED1: my_script.sh: 7: my_script.sh: arr[0]=f-1: not found my_script.sh: 7: my_script.sh: arr[1]=f-10: not found my_script.sh

我想将以f-开头的文件名存储在一个数组中。上面的代码不起作用

编辑:

我得到以下错误

#!/bin/bash

i=0
ls f-* | while read m
do
#echo $m
arr[$i]=$m
i=$((i+1))
done
EDITED1:

my_script.sh: 7: my_script.sh: arr[0]=f-1: not found
my_script.sh: 7: my_script.sh: arr[1]=f-10: not found
my_script.sh: 7: my_script.sh: arr[2]=f-15: not found
my_script.sh: 7: my_script.sh: arr[3]=f-2: not found
my_script.sh: 7: my_script.sh: arr[4]=f-20: not found
my_script.sh: 7: my_script.sh: arr[5]=f-3: not found
my_script.sh: 7: my_script.sh: arr[6]=f-4: not found
my_script.sh: 7: my_script.sh: arr[7]=f-5: not found
my_script.sh: 7: my_script.sh: arr[8]=f-6: not found
my_script.sh: 7: my_script.sh: arr[9]=f-7: not found
my_script.sh: 7: my_script.sh: arr[10]=f-8: not found
my_script.sh: 7: my_script.sh: arr[11]=f-9: not found

Shell变量赋值在
=
周围不能有任何空格,并且在赋值变量之前不能放置
$
。您也不需要使用
ls
,只需将通配符放在
for
语句中即可

#!/bin/bash

i=0
for i
do
#echo $m
arr[$i]= f-*i
echo $arr[i]
i=$((i+1))
done
你不需要一个循环

i=0     # initialize the variable before the loop
for m in f-*
do
    echo "$m"
    arr[$i]=$m
    i=$((i + 1))
done
这有用吗

arr=( f-* )
这应该打印如下

#!/bin/bash

echo ls: $(ls)
echo ""

seqmax=0
for file in $(ls ./f-* ); do
    char=$( echo $file | wc -c )
    if [ $char > $seqmax ];then
        seqmax=$char
    fi
done
i=0
for count in $(seq 1 1 $seqmax);do
    for file in $(ls | egrep "^f\-.{$count}$");do
        completearray[$i]=$file
        i=$(expr $i + 1 )
    done
done

echo ${completearray[@]}

如果您需要它只获取“数字”而不是所有字符,那么您可以在$(ls | egrep“^f \.{$count}$”)中更改文件的
;对$(ls | egrep“^f-[0-9]{$count}$”)中的文件执行
;do

my_script.sh:7:my_script.sh:arr[0]=f-1:找不到my_script.sh:arr[1]=f-10:找不到my_script.sh:7:my_script.sh:arr[2]=f-15:找不到my_script.sh:arr[3]=f-2:找不到my_script.sh:=f-3:找不到我的脚本sh:7:我的脚本sh:arr[6]=f-4:找不到我的脚本sh:7:我的脚本sh:arr[7]=f-5:找不到我的脚本sh:7:我的脚本sh:arr[8]=f-6:找不到。。我遇到了这样一个错误,您是否丢失了
#/开始时的bin/bash
?否。。我有/bin/bashIt对我来说很好。您有什么bash版本?请告诉如何检查bash版本。由于管道的原因,您的
循环将在子shell中执行,因此循环完成时其变量分配将不可见。请告诉我们可以做什么。我在I上面声明了变量m,然后我也得到了错误。如何全局声明变量以使其保留值在我的回答中使用类似于
循环。声明变量没有任何区别。子进程中的变量赋值不会影响父进程。@Barmar:是的,这是正确的Barmar。谢谢你让我明白。for循环帮助了我。script.sh:3:script.sh:Syntax error:“(“出乎意料,您是否像
sh script.sh
那样调用脚本?请确保使用bash来运行bash脚本。@glennjackman:您是对的,我使用的是sh,所以我得到了错误。谢谢。但我需要按此顺序打印f-1、f-2、f-3、f-15、f-16
#!/bin/bash

echo ls: $(ls)
echo ""

seqmax=0
for file in $(ls ./f-* ); do
    char=$( echo $file | wc -c )
    if [ $char > $seqmax ];then
        seqmax=$char
    fi
done
i=0
for count in $(seq 1 1 $seqmax);do
    for file in $(ls | egrep "^f\-.{$count}$");do
        completearray[$i]=$file
        i=$(expr $i + 1 )
    done
done

echo ${completearray[@]}
$ ./script.sh
ls: f-1 f-15 f-16 f-2 f-3 f-one f-two g-1 g-2 g-3 script.sh

f-1 f-2 f-3 f-15 f-16 f-one f-two