Набор опций можно визуализировать с помощью printf
:
$ printf '<%s> ' "-e ssh -axhPv" arg2 arg3 ; echo
<-e ssh -axhPv> <arg2> <arg3>
Если удалить кавычки, вы получите следующее:
$ printf '<%s> ' -e ssh -axhPv arg2 arg3 ; echo
<-e> <ssh> <-axhPv> <arg2> <arg3>
То есть: аргументы разбиты на пробелы и представлены как отдельные элементы к команде.
Однако общее решение - не удалять кавычки. Это открывает каждый аргумент для разделения IFS и расширения имени пути.
Правильным решением является использование массивов значений:
$ a=(-e ssh -axhPv arg2 arg3)
$ printf '<%s> ' "${a[@]}"; echo
<-e> <ssh> <-axhPv> <arg2> <arg3>
Это позволяет добавлять параметры и даже параметры с пробелами:
$ a+=("arg with spaces" "one more")
$ printf '<%s> ' "${a[@]}"; echo
<-e> <ssh> <-axhPv> <arg2> <arg3> <arg with spaces> <one more>
Таким образом, вы сохраняете контроль над тем, как аргументы будут передаваться команде.
Ваш скрипт переписан:
#!/bin/bash
# Set rsync command options.
rsync_options=( "-e" "ssh" "-axhPv" )
if [ "$deletion_type" = "DELETE_ON_DESTINATION" ]; then
rsync_options+=( "--delete" )
fi
if [ "$run_type" = "DRY_RUN" ]; then
rsync_options+=("--dry-run")
fi
log_file="/var/tmp/log/script.sh"
exclude_file="/var/tmp/log/excludethis"
source_dir=/a
destination_dir=/b
# Run the backup.
rsync_options+=('--log-file="'"$log_file"'"')
rsync_options+=('--exclude-from="'"$exclude_file"'"')
rsync_options+=("$source_dir")
rsync_options+=("$destination_dir")
### Remove the printf to actually run the command:
printf '<%s> ' rsync "${rsync_options[@]}"
ПРЕДОСТЕРЕЖЕНИЕ: Одна вещь, которую вы не можете поместить в массив, - это изменение направления.
Предполагая, что текст в круглых скобках сам по себе не может содержать круглые скобки и что вы имеете в виду меньше или равно 140 символам, попробуйте
grep -Po '(?<=\().{1,140}?(?=\))' in.txt > out.txt