Ho sofferto per un po 'di tempo con i problemi successivi che ho scritto script in cui ogni comando eseguito viene prima messo in una stringa, e poi eseguito. In questo modo, il comando viene scritto una sola volta e può essere analizzato, visualizzato, utilizzato più volte. Funziona bene la maggior parte del tempo ma non nei seguenti casi dettagliati qui sotto. Quindi se qualcuno di voi può aiutare, sarei più che felice;) Devo ammettere che ho sempre difficoltà a capire come funziona lo script quando si tratta di variabili contenenti virgolette e spazi, quindi se si conosce un buon tutorial ...
Caso 1: comando mkdir
dir="/tmp/Mytests/DirWith2 spaces 2"
cmdToRun="mkdir -p ${dir}"
echo "Running [${cmdToRun}]"
${cmdToRun} # <= this does not work, OK it seems normal !
cmdToRun="mkdir -p """${dir}""""
${cmdToRun} # <= this does not work either !
cmdToRun="mkdir -p \"${dir}\""
${cmdToRun} # <= this does not work either !
Caso 2: comando rsync
rsync_cmd="rsync -avz --stats "
rsync_destinationBaseDir="/tmp/ToTestRsync"
ListOfDirToSynchronize=( \
"/opt/dir1/subdir1" "/opt/dir1space 1/subdir1" "/opt/dir1space 1/subdir1space 1" )
rsync_host_from="root@SRV1:"
A loop on the directories in my ListOfDirToSynchronize
{
SourceDir="${ListOfDirToSynchronize[$i]}"
( # here we start a subshell to run // rsyncsto speed-up the whole process
cmdToRun="${rsync_cmd} ${rsync_host_from}'${SourceDir}/' ${rsync_destinationBaseDir}${SourceDir}"
funcLog " | INFO | Directories synchronisation | SubprocessID [${subProcessID}] | running command [${cmdToRun}]"
${cmdToRun} >> ${LOG_FILE} 2>&1 #<== this does not work when spaces in the directories
) # end of subshell
} # end of the loop