我有一个名为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
答案 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
但即使您在脚本中使用了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
和{{1}}之间的文件是否存在,如果存在,则打印出来:
{{1}}
答案 2 :(得分:1)
范围模式{A..B}
不接受A
或B
的变量。你需要常量。
解决方法可能是启动这样的子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 $