纯BASH中的列表理解?

时间:2011-07-16 22:28:04

标签: python bash list-comprehension

是否可以在python和其他语言中进行LC,但只能使用BASH结构?

我希望能做什么,例如:

function ignoreSpecialFiles()
{
    for options in "-L" "-e" "-b" "-c" "-p" "-S" "! -r" "! -w"; do
        if [[ $options "$1" -o $options "$2" ]];then
            return $IGNORED
        fi
    done
}

而不是使用这样的代码:

if [[ -L "$1" -o -e "$1" -o -b "$1" -o -c "$1" -o -p "$1" -o -S "$1" -o\
! -r "$1" -o ! -w "$1" ]]

你知道有关模拟LC的任何配方吗?

编辑:

更具特色的LC示例:

M = [x for x in S if x % 2 == 0] #is python

在bash中做同样事情的最pythonic方式是什么?

for x in S; do if x % 2 == 0;then (HERE MY HEAD EXPLODES) fi done

3 个答案:

答案 0 :(得分:12)

如果你眯着眼睛,命令替换中的循环看起来像列表理解。你的第二个例子可以写成:

M=$(for x in $S; do if [ $(( x % 2 )) == 0 ]; then echo $x; fi done)

答案 1 :(得分:5)

这是一种半通用格式,用于在bash中使用数组执行相当于LC的操作:

outarray=()
for x in "${inarray[@]}"; do
    if SOMECONDITION; then
        outarray+=(SOMEFUNCTIONOFx)
    fi
done

以下是此格式的第二个示例:

s=({1..10})
echo "${s[@]}"
# Prints: 1 2 3 4 5 6 7 8 9 10
m=()
for x in "${s[@]}"; do
    if (( x % 2 == 0 )); then
        m+=($x)
    fi
done
echo "${m[@]}"
# Prints: 2 4 6 8 10

这是另一个例子,具有不那么重要的功能"但没有条件:

paths=("/path/to/file 1" "/path/somewhere/else" "/this/that/the other" "/here/there/everywhere")
filenames=()
for x in "${paths[@]}"; do
    filenames+=( "$(basename "$x")" )
done
printf "'%s' " "${filenames[@]}"
# Prints: 'file 1' 'else' 'the other' 'everywhere' 

答案 2 :(得分:1)

您所描述的内容看起来不像列表推导...您可以使用单个括号而不是双括号来执行您想要的操作(使用变量来表示您要执行的测试)。举个例子:

function ignoreSpecialFiles()
{
    for options in "-L" "-e" "-b" "-c" "-p" "-S" "! -r" "! -w"; do
        if [ $options "$1" -o $options "$2" ]
        then
            return $IGNORED
        fi
    done
}