Как заключить команду в кавычки при написании сценариев оболочки
Команда, выполненная в следующем скрипте работает:
#!/bin/bash -xv
REM_DIR="/home/jan/rem-dir"
SSHOPTS="-C -c arcfour256 -o "\""ServerAliveInterval 15"\"
SSHUSER="jan@example.com"
CMD="ssh $SSHOPTS \"$SSHUSER\" \"find \\\"$REM_DIR/\\\" -path *lost+found -prune -o -type f -printf \\\"%P\\\\n\\\"\""
REM_FILES=`eval $CMD`
Это в основном выполняет это на удаленном хосте:
find "/home/jan/rem-dir/" -path *lost+found -prune -o -type f -printf "%P\n"
Но как это должно быть экранировано / отформатировано, если я хочу это так:
REM_FILES=`ssh ...`
Или же:
REM_FILES=$(ssh ...)
Хотя мой текущий скрипт работает нормально, я хотел бы знать, как правильно экранировать / заключать в кавычки при написании сценариев оболочки.
1 ответ
Лучший способ это:
#!/bin/bash -xv
REM_DIR="/home/jan/rem-dir"
SSHOPTS=(-C -c arcfour256 -o "ServerAliveInterval 15")
SSHUSER="jan@example.com"
REM_FILES=`ssh "${SSHOPTS[@]}" "$SSHUSER" "find \"$REM_DIR/\" -path \"*lost+found\" -prune -o -type f -printf \"%P\\n\""`
Основная проблема была с $SSHOPTS, трюк в том, чтобы поместить каждый аргумент в отдельный элемент массива.
@Dennis спасибо за полезную ссылку.