Tengo una variedad de archivos, ejemplo file=[a.yml, a.json,b.yml,b.json]
. Estoy iterando usando for
loop. Necesito excluir la .json
ejecución de los archivos cuando tienen ambos .yml
o .yaml
y .json
en la matriz. pero si solo tengo .json
en 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 .json
archivos en la matriz y verificar más adelante en el ciclo la existencia del .yml
archivo.
bash
tiene una buena sustitución de parámetros para eso:
${parameter%word} Remove matching suffix pattern.
En su caso, sería algo como esto (eliminando .json
y 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