私は書いたフィルター/選ぶ関数とストリームを入力として使用する関数です。新しい配列(2 4)を作成する必要があります。しかし、私の結果は何もありませんでした。私はこれがIFSに関連していると思います。
# func int -> bool
is_even () { (( $1 % 2 == 0 )) ;}
# func func -> int
filter () {
local function_to_apply=$1
local arg
while read -r arg; do
$function_to_apply $arg && echo $arg
done;:
}
# int array
integers=( 1 2 3 4 )
result=$(echo "${integers[*]}" | filter is_even)
declare -p result
出力は文字列です。""
declare -- result=""
期待される出力は配列です。( 2 4 )
declare -a result ='([0]="2" [1]="4")'
クレジットが必要な場所にクレジットを提供する:
http://www.binaryphile.com/bash/2018/07/26/approach-bash-like-a-developer-part-1-intro.html
ベストアンサー1
1行に関数入力を提供できます。この行は1 2 3 4
デフォルト値に拡張された文字列です。最初の呼び出しで単一行全体を読み取り、関数呼び出しで(引用符なしで)使用します。引用符がないため、シェルはスペースに文字列を表示し、関数は偶数ではなく最初の文字のみを使用します。これはトリガーされていないことを意味します。"${integers[*]}"
$IFS
read
arg
$arg
1
echo $arg
代わりに:
#!/bin/bash
is_even () { (( $1 % 2 == 0 )) ;}
filter () {
local function_to_apply="$1"
local arg
while read -r arg; do
"$function_to_apply" "$arg" && echo "$arg"
done
}
integers=( 1 2 3 4 )
result=$(printf '%s\n' "${integers[@]}" | filter is_even)
declare -p result
ここでの主な作業は、配列の要素を関数filter
の個々の行に印刷することです。
これにより、単一の文字列2\n4
(\n
改行文字がある場所)が提供されます。に文字列を割り当てるとき、これは驚くべきことではありませんresult
。
アレイを再インポートするには、最新バージョンでこれを実行できますbash
。
#!/bin/bash
is_even () { (( $1 % 2 == 0 )) ;}
filter () {
local func="$1"
local -n in_array="$2"
local -n out_array="$3"
local element
out_array=()
for element in "${in_array[@]}"; do
if "$func" "$element"; then
out_array+=( "$element" )
fi
done
}
integers=( 1 2 3 4 )
even_ints=()
filter is_even integers even_ints
declare -p even_ints
これは、関数内で変数を参照するために2つの名前を使用することですfilter
。 1つ目は入力配列、2つ目は出力配列です。
これはあなたに出力を与えるでしょう
declare -a even_ints=([0]="2" [1]="4")
関数に値を渡すもうfilter
1つの方法は、明らかに関数のコマンドラインから値を渡すことです。
#!/bin/bash
is_even () { (( $1 % 2 == 0 )) ;}
filter () {
local func="$1"
local -n out_array="$2"
shift 2
local element
out_array=()
for element do
if "$func" "$element"; then
out_array+=( "$element" )
fi
done
}
integers=( 1 2 3 4 )
even_ints=()
filter is_even even_ints "${integers[@]}"
declare -p even_ints