配列を繰り返しながら最後の項目を確認する方法はありますか?配列から検索コマンドを作成する

配列を繰り返しながら最後の項目を確認する方法はありますか?配列から検索コマンドを作成する

配列の項目を使用してfindコマンドオプション文字列を作成しようとしていますが、配列の最後の項目に別の文字列を追加したいと思います。

EXT=(sh mkv txt)

EXT_OPTS=(-iname)

# Now build the find command from the array
for i in "${EXT[@]}"; do
    #echo $i
    EXT_OPTS+=( "*.$i" -o -iname)
done

乾杯

編集する:

今私は以下が欲しい:

#!/bin/bash

EXT=(sh mkv txt)

EXT_OPTS=()
# Now build the find command from the array
for i in "${EXT[@]}"; do
    EXT_OPTS+=( -o -iname "*.$i" )
done

# remove the first thing in EXT_OPTS
EXT_OPTS=( "${EXT_OPTS[@]:1}" )

# Modify to add things to ignore:

EXT_OPTS=( "${EXT_OPTS[@]:-1}" )
EXT_OPTS=( '(' "${EXT_OPTS[@]}" ')' ! '(' -iname "*sample*" -o -iname "*test*" ')' )

#echo "${EXT_OPTS[@]}"

searchResults=$(find . -type f "${EXT_OPTS[@]}")

echo "$searchResults"

私のためにこれを生成します:

./Find2.sh
./untitled 2.sh
./countFiles.sh
./unrar.sh
./untitled 3.sh
./untitled 4.sh
./clearRAM.sh
./bash_test.sh
./Test_Log.txt
./untitled.txt
./Find.txt
./findTestscript.sh
./untitled.sh
./unrarTest.sh
./Test.sh
./Find.sh
./Test_Log copy.txt
./untitled 5.sh
./IF2.sh

答え1

別の順序でオプションを追加した後、最初の要素を削除します。

EXT=(sh mkv txt)

EXT_OPTS=()
# Now build the find command from the array
for i in "${EXT[@]}"; do
    EXT_OPTS+=( -o -iname "*.$i" )
done

# remove the first thing in EXT_OPTS
EXT_OPTS=( "${EXT_OPTS[@]:1}" )

$@何も使用しないと、よりきれいに見えます。

EXT=(sh mkv txt)

# Empty $@
set --

# Now build the find command from the array
for i in "${EXT[@]}"; do
    set -- -o -iname "*.$i"
done

# remove the first thing in $@
shift

# assign to EXT_OPTS (this would be optional, you could just use "$@" later)
EXTS_OPTS=( "$@" )

読みにくいので-o -iname "*.$i"、中間配列に追加することをお勧めします。"*.$i" -o -iname追加して作成することも-o -iname "*.$i"できます。$@本物shift最初のループ-o以降の内容を閉じるのは簡単です。


一部の除外(無視する名前)と組み合わせる:

extensions=( sh mkv txt )
ignore_patterns=( '*sample*' '*test*' )

include=()
# Now build the find command from the array
for ext in "${extensions[@]}"; do
    include+=( -o -iname "*.$ext" )
done

# Do the ignore list:
ignore=()
for pattern in "${ignore_patterns[@]}"; do
    ignore=( -o -iname "$pattern" )
done

# combine:
EXT_OPTS=( '(' "${include[@]:1}" ')' ! '(' "${ignore[@]:1}" ')' )

テスト優先順位を指定するために括弧が追加されました。

答え2

最も簡単な方法は、事後にアレイを回復することです。その後done追加します。

unset 'EXT_OPTS[-1]'
unset 'EXT_OPTS[-1]'

削除されます最後の2つの値(-oおよび-iname)、必要に応じて他の値を追加または単純に置き換えることができます。

可能少し重複条件を追加する方が簡単です。

EXT_OPTS+=( "*.${EXT[0]}" )

実際の状況がもう少し複雑な場合は、上記の方法に従って問題を解決してください。

答え3

配列を繰り返しながら最後の項目を確認する方法はありますか?

質問に文字通り答えると、直接そうすることはできないようです。しかし、もちろん、反復中に要素数を計算し、配列サイズと比較することもできます。

test=(foo bar blah qwerty)
count=${#test[@]}
n=1
for x in "${test[@]}"; do
   last=""
   if [[ $((n++)) -eq count ]]; then
        last=" (last)"            # last element, add a note about that
   fi
   printf "%s%s\n" "$x" "$last"
done

もちろん状況によっても可能です。最初プロジェクトはユニークです。

関連情報