我得到了下面这个简单的脚本,它调用一个外部脚本,其中包含一些文件名和参数,或者是一个分隔符,或者是一组剪切位置。我的问题是:有没有办法让文件名“动态使用通配符”,即目录始终包含这些文件名,但两端都有额外的文本?但是脚本可以进行某种匹配,以获得基于“包含”的完整文件名。
当前/release/ext/目录内容:
2011storesblah.dat
hrlatest.dat
emp_new12.txt例如,今天的目录包含这些文件(但下周该目录中的文件名可能会有稍微不同的前缀。例如:
stores_newer.dat
finandhr.dat
emps.txt脚本:
#!/bin/bash
FILES='/release/ext/stores.dat "|"
/release/ext/emp.txt 1-3 4-11 15-40
/release/ext/hr.dat "|" 2'
for f in $FILES
do
echo `sh myexternalscript.sh $f`;
done注意:如果我的脚本中的文件与目录中的两个以上的文件匹配(它总是只匹配一个),那么就不需要处理这种情况。此外,它只能匹配脚本中指定的文件类型。而且,我不需要递归搜索,只需要在/release/ext/目录中查找即可。我运行的是SunOS 5.10。
发布于 2012-01-07 22:32:41
$FILES=`find /release/ext -name *stores*.dat`
for FILE in $FILES do
# need to test for empty, case $FILES is empty
test -n "$FILE" && /do/whatever/you/want
done;发布于 2012-01-08 07:05:22
不清楚管道字符和数字在$FILES变量中的作用。然而,这里有一些你可能会发现有用的东西:
#!/bin/bash
filespecs='*stores*.dat *hr*.dat *emp*.txt'
dir='/release/ext'
cd "$dir"
for file in $filespecs
do
sh myexternalscript.sh "$dir/$file"
done注意,您的问题被标记为"bash“,并且您在shebang中使用了"bash”,但是由于某些原因,您在调用其他脚本时使用了"sh“。在某些系统上,sh与Bash是符号链接的,但当直接调用时,它的行为将与Bash不同。在许多系统上,sh与Bash是完全分开的。
为了扩展globs并合并其他参数,您将需要违反总是引用变量的Bash规则(这是一个例外的例子)。
filespecs='*stores*.dat | 3
*hr*.dat 4 5
*emp*.txt 6 7 8'
while read -r spec arg1 arg2 arg3 arg4
do
sh myexternalscript.sh "$dir"/$spec "$arg1" "$arg2" "$arg3" "$arg4"
done < <(echo "$filespecs")可以根据需要使用任意多的"arg“参数。Extras将作为空参数传递,但要设置参数。如果接受它们的参数比变量多,那么最后一个变量将包含除与其相对应的余数之外的所有余数。这个版本不需要cd,因为glob直到目录被前置时才被扩展,而在第一个版本中,glob在目录被前置之前被扩展。
如果您以问题中显示的方式引用管道,则双引号将包含在参数中。在我展示的方式中,只有竖线字符被传递,但它是受保护的,因为变量在被引用时被引用。
https://stackoverflow.com/questions/8770369
复制相似问题