2011-07-16 5 views
4

Pythonや他の言語のようにLCを行うことはできますが、BASH構造体を使用するだけですか?純粋な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で同じことを行うための最も神託の方法は何ですか?

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

いいえ何をしようとしていますか?適切な作業には適切なツールを使用してください。 "あなたが持っているものがすべてハンマーであれば、すべての問題は爪のように見えます..." –

+0

今日は3回目ですが、bashスクリプティング@Adam ^^ –

+7

"bash "?これはナンセンスです。 Pythonの方法はPythonを使うことです。 BashはBashを使う方法です。 – Johnsyweb

答えて

3

ここアレイと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' 
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 
} 
+0

@ Gilles:今働いています。私は実際に 'if test" $ options "" $ 1 "; then'を使用していますが、[]と同じです。これは私の具体的な例ですが、LSが一般的には、たとえNOが最終的な答えになるかもしれないとしても、もっと多くのアイデアを見たいと思っています... –

10

コマンド置換のループは、あなたがうんざりするとリスト内包のように見えます。あなたの第二の例のように書くことができます。

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

これはPythonの構文に非常に近いです。もちろん、内部的にはやや異なりますが、結果はほぼ同じです。+2(私が望む) –

+0

+1の "あなたがうんざり"の場合 –

+0

readarray -t M <()の 'M = $()'を取り替えるまで、これはうまくいかなかった。 – CMCDragonkai

関連する問題