带有数值范围的ls在bash脚本中不起作用

时间:2013-12-29 15:30:04

标签: bash ls

我有一个名为file_1.ext...file_90.ext的文件夹。我可以使用以下命令列出其中的一系列:

$ ls /home/rasoul/myfolder/file_{6..19}.ext

但是当我想在bash脚本中使用这个命令时,它不起作用。这是一个最小的例子:

#!/bin/bash

DIR=$1
st=$2
ed=$3

FILES=`ls ${DIR}/file\_\{$st..$ed\}.ext`
for f in $FILES; do
  echo $f
done

将其作为,

运行
$ bash test_script.sh /home/rasoul/myfolder 6 19

输出以下错误消息:

ls: cannot access /home/rasoul/myfolder/file_{6..19}.ext: No such file or directory

4 个答案:

答案 0 :(得分:3)

支撑扩张在变量扩张之前发生。

(此外,不要解析 ls 输出。)。你可以说:

for f in $(seq $st $ed); do 
    echo "${DIR}/file_${f}.ext";
done

答案 1 :(得分:2)

BASH始终在brace expansion之前variable expansion ls /home/rasoul/myfolder/file_{6..19}.ext seq正在寻找文件eval

当我需要扩展包含变量的数字范围时,我个人使用echo。您还可以使用eval echo {$st..$ed} seq完成同样的事情:

ls

但即使您在脚本中使用了lsBASH也不会在没有循环的情况下迭代您的范围。如果要检查范围中的文件是否存在,我也会避免在此处使用-e,因为您将在不存在的范围内的每个文件中获得错误。 $st可以使用$ed检查文件是否存在。

这是一个循环,用于检查变量for n in $(seq $st $ed); do f="${DIR}/file_$n.ext" if [ -e $f ]; then echo $f fi done 和{{1}}之间的文件是否存在,如果存在,则打印出来:

{{1}}

答案 2 :(得分:1)

范围模式{A..B}不接受AB的变量。你需要常量。 解决方法可能是启动这样的子shell:

RESULT=$(bash -c "ls {$a..$b}")

答案 3 :(得分:1)

数字范围必须是文字数字,您不能将变量放在那里。要做到这一点,您需要使用eval

FILES=`eval "ls ${DIR}/file_{$st..$ed}.ext"`

这是我测试的成绩单(我在bash 4.1.5和3.2.48中尝试过)。

imac:testdir $ touch file_{1..30}.ext
imac:testdir $ st=6
imac:testdir $ ed=20
imac:testdir $ DIR=.
imac:testdir $ FILES=`eval "ls ${DIR}/file_{$st..$ed}.ext"`
imac:testdir $ echo "$FILES"
./file_10.ext
./file_11.ext
./file_12.ext
./file_13.ext
./file_14.ext
./file_15.ext
./file_16.ext
./file_17.ext
./file_18.ext
./file_19.ext
./file_20.ext
./file_6.ext
./file_7.ext
./file_8.ext
./file_9.ext
imac:testdir $