0

次のシナリオのスクリプトを作成するには、助けが必要です。

(*.cfg)要件は、特定のディレクトリ内の構成ファイルの数に基づいて、ファイル拡張子を付けずにすべての構成ファイル名を配列にロードする必要があることです。ディレクトリに構成ファイルが 1 つしかない場合は、配列に値が割り当てられます""(唯一の使用可能な構成ファイルの名前ではありません)。

論理演算子を使用してこれを実行しようとしています。これは私がこれまでに試したことです。

[`ls *.cfg |wc -l`] || code_to_initialize_array;

ここでの問題は、構成ファイルが 1 つしかない場合をどのように統合するかということです。

4

4 に答える 4

4

ショートコード:

#!/bin/bash
array=(*.cfg)
array=("${array[@]%.cfg}")
[ ${#array[@]} -eq 1 ] && array=""
于 2013-09-06T09:30:24.830 に答える
2
#!/bin/bash

config=(*.cfg) #glob instead ls usage
num=${#config[@]}

case $num in
0)
echo "No config file"
;;
1)
echo "Only one config file"
;;
*)
code_to_initialize_array
;;
esac
于 2013-09-06T08:46:21.133 に答える
0

私はいつも、forこのような状況でループを悪用するのが好きでした。

for x in *.cfg; do
    [[ -f $x ]] && code_to_initialize_array
    break

明示的とは、ファイルbreakの数に関係なく、ループが 1 回だけ繰り返されることを意味します.cfg。何もない場合は*.cfg文字通りに扱われるため、実行を試みる前に[[ -f $x ]]「最初の」cfgファイルが実際に存在するかどうかを確認しますcode_to_initialize_array

于 2013-09-06T12:53:34.280 に答える
0

要件に合わせて、このサンプル スクリプトを使用できます。詳細で変数名は長いですが、独自のカスタマイズを行うことができます。に依存せず、パス名展開の影響を受けないため、readarrayより安全に使用できます。A=($(...))IFS

#!/bin/bash

DIR=/path/to/somewhere

readarray -t FILES < <(compgen -G "${DIR%/}/*.cfg")  ## Store matches to array.
FILES_COUNT=${#FILES[@]}                             ## Match count.
FILES_NAMES=("${FILES[@]##*/}")                      ## No directory parts.
FILES_NAMES_WITHOUT_CFG=("${FILES_NAMES[@]%.cfg}")   ## No .cfg extension.

if [[ FILES_COUNT -gt 0 ]]; then
    printf "File: %s\n" "${FILES[@]}"
    printf "Name: %s\n" "${FILES_NAMES[@]}"
    printf "Name (no .cfg): %s\n" "${FILES_NAMES_WITHOUT_CFG[@]}"
    printf "Total: %d\n" "$FILES_COUNT"
fi

各エントリのインデックス番号は同じであることに注意してください。もそう${FILES[1]}です。エントリは index で始まります。${FILES_NAMES[1]}${FILES_NAMES_WITHOUT_CFG[1]}0

これにより、他の詳細を確認することもできます。

if [[ FILES_COUNT -gt 0 ]]; then
    for I in "${!FILES[@]}"; do
        printf "File: %s\n" "${FILES[I]}"
        printf "Name: %s\n" "${FILES_NAMES[I]}"
        printf "Name (no .sh): %s\n" "${FILES_NAMES_WITHOUT_CFG[I]}"
        printf "Index number: $I\n\n"
    done
    printf "Total: %d\n" "$FILES_COUNT"
fi
于 2013-09-06T09:41:28.480 に答える