Это связано с тем, что расширение $variable
внутри документа ssh
расширяется локальной оболочкой на локальном компьютере, а не в удаленной оболочке. Как правило, мы избегаем последовательностей расширения, т. е. расширения переменной $var
как \$var
и подстановок команд как \$(..)
вместо $(..)
, если мы ожидаем, что расширение произойдет в удаленной оболочке.
Таким образом, в вашем цикле for
разделение на ,
происходит с вашей командой sed
, но ваше расширение "$i"
снова произойдет в локальной оболочке, что должно было происходить в удаленной оболочке. Из-за отсутствия подходящих escape-последовательностей, echo "$i"
никогда не увидит значение в локальной оболочке.
Вы можете обойти это, пометив $i
как \$i
, чтобы расширение происходило удаленно. Кроме того, цикл for i in $(echo $variable | sed sed "s/,/ /g")
является чрезвычайно хрупким способом перебора списка, разделенного на de -limiter ,
. Используйте встроенную оболочку -ins, в данном случае read
ssh -i my.pem -p 2022 ec2-user@ip-address 'bash -s' <<EOF
echo "input $variable"
IFS="," read -ra split <<<"$variable"
for var in "\${split[@]}"; do
printf '%s\n' "\$var"
done
EOF
Обратите внимание на использование escape-последовательностей вокруг расширения массива, "\${split[@]}"
и переменной "\$var"
, которая обеспечивает удаленное расширение этих переменных, а не на локальном компьютере.
Вы можете использовать Миллер .
В примере, начиная с
a,v1,v2,v3
a,25,56,23
b,58,56,23
можешь бежатьmerge-fields
mlr --csv merge-fields -a mean,stddev -r "v[0-9]" -o "result" -k input.csv >output.csv
иметь
а | v1 | v2 | v3 | результат _среднее значение | результат _стандартное отклонение |
---|---|---|---|---|---|
и | 25 | 56 | 23 | 34,666667 | 18.502252 |
б | 58 | 56 | 23 | 45,666667 | 19.655364 |