Excluir nombres de archivos similares de una matriz usando un script de shell

Excluir nombres de archivos similares de una matriz usando un script de shell

Tengo una variedad de archivos, ejemplo file=[a.yml, a.json,b.yml,b.json]. Estoy iterando usando forloop. Necesito excluir la .jsonejecución de los archivos cuando tienen ambos .ymlo .yamly .jsonen la matriz. pero si solo tengo .jsonen la matriz (por ejemplo [a.json,b.json], debe pasar por el bucle. ¿Es eso posible con el script de Shell?

Básicamente, estoy tratando de comparar las cadenas en una matriz y excluir el duplicado dinámicamente.

¿Es esto posible con Shell?


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'''

Respuesta1

Puedes ver si tienes el otro valor antes de continuar:Compruebe si una matriz bash contiene un valor.

También puede conservar solo los .jsonarchivos en la matriz y verificar más adelante en el ciclo la existencia del .ymlarchivo.

bashtiene una buena sustitución de parámetros para eso:

${parameter%word}

Remove matching suffix pattern.

En su caso, sería algo como esto (eliminando .jsony agregando .yml:

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

Respuesta2

Pruebe algo como esto:

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

información relacionada