我有一个 bash 函数,其中参数是文件。因此下面的打印语句给出
opts="$@"
echo "$fargs"
Result:
linge-cellar.rc linge-cellar.rc~ linge-checkn.rc linge-checkn.rc~ linge-comint.rc linge-comint.rc~ linge-comseq.rc linge-comseq.rc~ linge-console.rc linge-console.rc~ linge-curiplaya.rc linge-curiplaya.rc~ linge-dircolors.rc linge-dircolors.rc~ linge-firefly.rc linge-firefly.rc~ linge-mosaic.rc linge-mosaic.rc~ linge-profile.rc opcon-cellar.rc~
我有两个数组incl
,excl
它们存储要处理的文件类型。
Example: incl=( .rc )
我想列两个清单。一种文件与数组中的文件类型匹配的文件 incl
(例如,带有.rc
扩展名的文件)。另一个列表包含文件类型匹配失败的文件名(例如带有.rc~
扩展名的文件)。
从一个简单的循环开始
fargs="$@"
local f ty aggr=()
for f in $fargs; do
for ty in "${incl[@]}"; do
[[ "$f" =~ *${ty}$ ]] && aggr+=( "$f" )
done
done
echo "$fargs"
echo
echo "${incl[@]}"
echo
echo " aggr:"
echo " ${aggr[*]}"
但是出了点问题,因为我总是得到一个空aggr
数组。
dvorak linge-cellar.rc linge-cellar.rc~ linge-checkn.rc linge-checkn.rc~ linge-comint.rc linge-comint.rc~ linge-comseq.rc linge-comseq.rc~ linge-console.rc linge-console.rc~ linge-curiplaya.rc linge-curiplaya.rc~ linge-dircolors.rc linge-dircolors.rc~ linge-firefly.rc linge-firefly.rc~ linge-mosaic.rc linge-mosaic.rc~ linge-profile.rc opcon-cellar.rc~
.rc
aggr:
主要问题是您将正则表达式语法(
$
行锚)与全局模式语法(前导*
通配符)混合在一起,您可以通过简单的测试来验证:(语法有效测试的退出状态应该是 0 或 1)。
您的测试可以是
或者
同样,
fargs="$@"
是一个标量赋值;您的未引用for f in $fargs
然后将(字符串)变量拆分为空格 - 如果任何文件名包含空格,则会中断。你应该使用fargs=("$@")
然后for f in "${fargs[@]}"
。或者,直接遍历位置参数,for f in "$@"
或者,POSIXLY,只是for f
:测试:
在 zsh 中,可以通过
${name:#pattern}
对位置参数数组应用参数扩展来避免内循环,使用M
修饰符删除不匹配的元素(默认,不带M
,删除匹配的元素):看到这个类似的 Unix & Linux 答案是否有一种简单的方法来获取不以连字符开头的所有参数的数组?