вызов Bash-скрипта с массивом строк с пробелами в качестве аргумента

Вопрос или проблема

Я довольно нов в bash.
Я хочу вызвать скрипт, расположенный на удаленной машине с Linux, передавая некоторые обычные аргументы и один массив. Массив содержит строковые элементы, которые могут содержать пробелы.

Я написал минимальный пример:

на стороне сервера: copyFiles.sh

#!/bin/bash

msg=$1  
msg2=$2
shift           
shift
arr=("$@") # Перестраиваем массив с остальными аргументами
for ((i = 0; i < ${#arr[@]}; i++))
do
    echo $msg $msg2 "${arr[$i]}"
done

На стороне хоста:

first="first"
second="second"
array=("arra y1" "array2" "array3")

plink -ssh username@hostname -pw mypwd -batch  " bash scripts/copyFiles.sh $first $second "${array[@]}" "

Вывод:

first second arra
first second y1
first second array2
first second array3

Что я хочу:

first second arra y1
first second array2
first second array3

Спасибо

Я думаю, вам просто нужно использовать \" для аргументов с пробелами.
Вы пробовали экранировать строку с пробелами следующим образом:

“\”arra y1\””

Я думаю, это может решить вашу проблему.

Ответ или решение

Для того чтобы передать массив строк с пробелами в качестве аргумента для bash-скрипта на удалённой машине, нужно правильно экранировать строки с пробелами при формировании команды. Ваша текущая попытка не сохраняет пробелы в элементах массива, потому что они интерпретируются как отдельные аргументы.

Вот подробное решение, использующее экранирование:

Серверная часть (copyFiles.sh):

Ваша серверная часть скрипта корректна и не требует изменений:

#!/bin/bash

msg=$1  
msg2=$2
shift           
shift
arr=("$@") # Восстановление массива с остальными аргументами
for ((i = 0; i < ${#arr[@]}; i++))
do
    echo "$msg" "$msg2" "${arr[$i]}"
done

Клиентская часть:

Чтобы корректно передать массив строк с пробелами, вам нужно использовать квадратные скобки с кавычками. Вот ваш исправленный код:

first="first"
second="second"
array=("arra y1" "array2" "array3")

# Преобразуем элементы массива в строки, заключённые в кавычки
quoted_array=()
for element in "${array[@]}"; do
    quoted_array+=("\"$element\"")  # Экранируем пробелы
done

# Присоединяем элементы массива в одну строку
quoted_array_string="${quoted_array[*]}"

# Передаём аргументы через plink с правильным экранированием
plink -ssh username@hostname -pw mypwd -batch "bash scripts/copyFiles.sh \"$first\" \"$second\" $quoted_array_string"

Ожидаемый вывод:

После внесения вышеприведённых изменений, вывод будет следующим:

first second arra y1
first second array2
first second array3

Объяснение:

  1. Экранирование: Мы используем \"$element\", чтобы каждый элемент массива в строке был заключён в кавычки, что позволяет сохранить пробелы при передаче.

  2. Объединение строк: Все элементы массива конкатенируются в одну строку через "${quoted_array[*]}".

Такое решение должно полностью удовлетворить ваши требования и позволить передавать элементы массива с пробелами без потери информации.

Оцените материал
Добавить комментарий

Капча загружается...