LƯU Ý: trên thực tế có hai lớp cho câu hỏi ở đây. Một là 'Tôi muốn thực thi một nhiệm vụ không hề nhỏ trên một máy chủ từ xa có thể truy cập thông qua SSH'. Cái khác là 'Tôi đang cố gắng truyền một chuỗi phức tạp cho một lệnh và đối số kết thúc khác với những gì tôi dự định.' Tôi đang trả lời câu hỏi cấp thấp mà không thảo luận về cách tiếp cận được sử dụng là "đúng" (thuận tiện, không dễ bị lỗi, an toàn, v.v.) để giải quyết vấn đề cấp cao. Như được chỉ ra bởi các câu trả lời và ý kiến khác, nó hoàn toàn có thể không.
Dòng lệnh của bạn chủ yếu là đúng; bạn chỉ phải thay đổi trích dẫn một chút.
Vấn đề chính là các chuỗi trích dẫn kép được mở rộng bởi trình bao cục bộ của bạn và do đó các $(...)phần sẽ được đánh giá trên hệ thống cục bộ của bạn. Để chuyển chúng qua hệ thống từ xa, bạn phải đặt tập lệnh trong dấu ngoặc đơn.
Bạn cũng có một số dấu ngoặc kép nhúng. Trong kịch bản gốc của bạn, có các đối số cho hai echos; nếu bạn thay đổi trích dẫn bên ngoài thành dấu ngoặc đơn, nó sẽ là tập lệnh awk. Những kết quả này sẽ dẫn đến việc các dấu ngoặc kép bị bỏ qua, điều này không làm phiền đến echos, nhưng nó sẽ làm rối loạn tập lệnh awk, vì dấu lớn hơn sẽ trở thành chuyển hướng đầu ra. Vì vậy, sau khi bạn thay đổi dấu ngoặc kép bên ngoài thành dấu ngoặc đơn, hãy thay đổi dấu ngoặc kép thành dấu ngoặc kép.
Đây là kịch bản của bạn với trích dẫn cố định. Kịch bản có thể có vấn đề khác, tôi chỉ sửa lỗi cú pháp.
#!/bin/bash
ssh -t test@192.168.94.139 'cd /var/www/test.com/backup ;
if [ $(ls | wc -l) -lt 3 ]
then
echo "Less"
else [ $(ls -t *.tgz|awk "NR >3"|xargs rm -f) ]
echo "deleted"
fi'