Исключить похожие имена файлов из массива с помощью скрипта оболочки

Исключить похожие имена файлов из массива с помощью скрипта оболочки

У меня есть массив файлов, пример file=[a.yml, a.json,b.yml,b.json]. Я выполняю итерацию с помощью forцикла. Мне нужно исключить .jsonфайлы из выполнения, когда в массиве есть .ymlи или .yamlи . Но если у меня есть только в массиве (пример ), он должен пройти через цикл. Возможно ли это с помощью скрипта оболочки?.json.json[a.json,b.json]

По сути, я пытаюсь сравнить строки в массиве и динамически исключить дубликаты.

Возможно ли это с помощью оболочки?


filename=$(git show --pretty="format:" --name-only $CODEBUILD_RESOLVED_SOURCE_VERSION)
echo "$filename"
mkdir report || echo "dir report exists"
for file in ${filename}; do
    echo ${file}
    ext=${file##*.}
    if [ $ext == "yaml" ] || [ $ext == "yml" ] || [ $ext == "json" ]; then
        if [ ${file} != "buildspec.yml" ] && [ ${file} != "stackupdatebuildspec.yml" ] && [ ${file} != "specs.json" ]; then
            stack=$(echo ${file} | cut -d "." -f 1)
            stackName="${stack//[\/]/-}"
            echo ${stackName}
            howmany() { echo $#; }
            numOfFilesValidated=$(howmany $listOfFilesToScan)
            echo "=========================================== Syntax validation started =============================================================="
            cfSyntaxLogFile="cf-syntax-validation-output"
            numOfFailures=0
            numOfValidatedFiles=0
            for file_to_scan in $listOfFilesToScan; do
                if [[ $(cfn-lint -t "$file_to_scan" --parameter-values-path "${stack}.json" --append-rules ./append_rules --override-spec ./over_ride_spec/spec.json |& tee -a $cfSyntaxLogFile) == "" ]]; then
                    echo "INFO: Syntax validation of template $file: SUCCESS"
                    ((numOfValidatedFiles++))
                else
                    echo "ERROR: Syntax validation of template $file: FAILURE"
                    ((numOfFailures++))
                fi
            done'''

решение1

Прежде чем двигаться дальше, вы можете проверить, есть ли у вас другое значение:Проверьте, содержит ли массив bash значение.

Вы также можете сохранить только .jsonфайлы в массиве и позже в цикле проверить существование файла .yml.

bashдля этого есть удобная замена параметров:

${parameter%word}

Remove matching suffix pattern.

В вашем случае это будет выглядеть примерно так (удалив .jsonи добавив .yml):

if [ ! -f "${filename%.json}.yml" ]
then
    # process
fi

решение2

Попробуйте что-то вроде этого:

declare -A fhash

# Load $files array with 'git show -z' - NUL-separated filenames in case
# of spaces, newlines, etc.
mapfile -d '' -t files < <(git show -z --pretty="format:" --name-only "$CODEBUILD_RESOLVED_SOURCE_VERSION")

# build an associative array (hash) from the files array, so we can easily
# check if a matching .yml filename exists for .json and .yaml files.
for f in "${files[@]}"; do
  fhash["$f"]=1
done

# now process each of the filenames in the $files array.
for f in "${files[@]}"; do
  # ignore these filenames
  [[ $f =~ ^(buildspec.yml|stackupdatebuildspec.yml|specs.json)$ ]] && continue

  base=${f%.*}       # get base filename
  ext=".${f##*.}"    # get file's "extension"

  # ignore '.json' and .'yaml' files if there is a matching .yml filename.
  # also ignore .json files if there is a matching .yaml filename
  [[ $ext =~ \.(json|yaml)$ ]] && [ "${fhash[$base.yml]}"  -eq 1 ] && continue
  [[ $ext =~ \.json$        ]] && [ "${fhash[$base.yaml]}" -eq 1 ] && continue

  # The code so far has skipped/ignored all of the files we don't want to
  # process, so you can do whatever you need with "$f".

  # ... your code here ...
done

Связанный контент