【问题标题】:ls with numeric range doesn't work inside bash script带有数字范围的 ls 在 bash 脚本中不起作用
【发布时间】:2015-04-22 05:32:13
【问题描述】:

我有一个文件夹,其中包含名为 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

【问题讨论】:

    标签: bash ls


    【解决方案1】:

    大括号扩展发生在变量扩展之前。

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

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

    【讨论】:

    • 谢谢!在echo 命令中删除f 周围的大括号后,此方法有效。
    • 你用的是什么外壳?它应该在有或没有大括号的情况下工作。
    • 我在 Ubuntu 12.04 中使用标准终端。
    • 你总是可以在变量名周围加上大括号。此命令中不需要它们,但仍应有效。
    • 如果您不能使用大括号并且我的 eval 解决方案不起作用,那么您的外壳中就会出现问题。
    【解决方案2】:

    BASH 总是在variable expansion 之前执行brace expansion,这就是为什么ls 正在寻找文件/home/rasoul/myfolder/file_{6..19}.ext

    当我需要扩展包含变量的数字范围时,我个人使用seq。你也可以使用evalecho 来完成同样的事情:

    eval echo {$st..$ed}
    

    但即使您在脚本中使用了seqls 也不会在没有循环的情况下遍历您的范围。如果您想检查该范围内的文件是否存在,我也将避免在此处使用ls,因为您将收到该范围内不存在的每个文件的错误。 BASH 可以使用-e 检查文件是否存在。

    这是一个循环,它将检查文件是否存在于变量 $st$ed 之间的范围内,如果存在则打印它:

    for n in $(seq $st $ed); do 
        f="${DIR}/file_$n.ext"
        if [ -e $f ]; then
            echo $f
        fi
    done
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的解释!你知道任何解决方法吗?
      • Barmar 建议了一个解决方法,使用eval。您也可以使用bash -c 启动子shell。添加示例
      【解决方案4】:

      数值范围必须是文字数字,您不能在其中放入变量。为此,您需要使用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 $ 
      

      【讨论】:

      • 感谢您的建议,但它也会输出相同的错误!
      猜你喜欢
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      相关资源
      最近更新 更多