Điểm:0

Tôi gặp sự cố với qoutes trong tập lệnh bash của mình

lá cờ au

làm thế nào để làm như vậy trong tập lệnh này tìm kiếm thứ gì đó từ cơ sở dữ liệu. anh ấy đã tìm kiếm nó và đổi tên nó trong thiết bị đầu cuối. Tôi có một vấn đề với các trích dẫn ở đây. Có lẽ bất cứ ai biết làm thế nào để sửa chữa nó?

spr-ustawien()
{
echo -e "\e[31;43mSprawdzanie UstawieÅ\e[0m \e[101mIP $1\e[0m"
intertube=0
trong khi [ $intertube -ne 1 ]; làm
ping $1 -c 5
nếu [ $? -eq 0 ]; sau đó
sshpass -p (vượt qua) ssh -t (người dùng)@$1 "
sudo sqlite3 config.sqlite "CHỌN * TỪ cài đặt" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
lối ra "
tiếng vang -e "\e[1;5;32mSprawdzony\e[0m"
ống thông nhau=1;
khác
echo -e "\e[1;5;31m!!! JEST OFFLINE !!!\e[0m"
nghỉ
fi
xong
}
Tom Yan avatar
lá cờ in
`"Punkt Sprzedaży"` phải là `\"Punkt Sprzedaży\"`?
Black4Killer avatar
lá cờ au
Vẫn không hoạt động. awk: dòng 1: lỗi cú pháp tại hoặc gần [Lỗi: đầu vào không đầy đủ
djdomi avatar
lá cờ za
@Black4Killer vui lòng cập nhật câu hỏi với trạng thái mã hiện tại `sub(/SALE_POINT/,"\033[1mPunkt` nếu tôi hiểu trường hợp `sub(/SALE_POINT/,\"\033[1mPunkt`if you don't) Nếu bạn muốn dịch một ký tự đặc biệt thì nó phải bắt đầu bằng \CHAR trong đó char là ký tự đặc biệt, bạn cũng có thể gỡ lỗi nó khi bắt đầu cùng một lệnh với `echo` vì vậy nó sẽ cho bạn biết chính xác ý nghĩa của nó `echo Sudo sqlite3 config .sqlite "CHỌN * TỪ cài đặt" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/\,"\033[1mPunkt Sprzedaży:\033[0m\")}1' && thoát "`
Black4Killer avatar
lá cờ au
@djdomi họ đã chỉ cho tôi: ```bash: /home/black/.bash_aliases: dòng 28: lỗi cú pháp gần mã thông báo không mong muốn `)' ```
Điểm:3
lá cờ ph

Đối với tôi, có vẻ như vấn đề cơ bản là các trích dẫn không lồng vào nhau theo cách bạn đang sử dụng chúng trong ssh chỉ huy. Đó là, trong lệnh này:

sshpass -p (vượt qua) ssh -t (người dùng)@$1 "
sudo sqlite3 config.sqlite "CHỌN * TỪ cài đặt" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
lối ra "

Các " Trong "CHỌN * TỪ... thực sự là một trích dẫn gần (khớp với trích dẫn mở ở dòng trước), vì vậy thay vì CHỌN * TỪ cài đặt nằm trong hai lớp dấu ngoặc kép, nó thực sự hoàn toàn không được trích dẫn (và kết quả là, * sẽ mở rộng thành danh sách các tệp trong thư mục cục bộ, gây ra sự hỗn loạn mà ai cũng biết).

Như djdomi đã nói trong một bình luận, bạn có thể thấy các đối số ssh trông giống như sau khi trình bao đã phân tích cú pháp chúng (và do đó, nội dung sẽ được gửi đến hệ thống từ xa để được thực thi) bằng cách thay thế ssh lệnh với tiếng vang. Khi tôi chạy cái này:

tiếng vang"
sudo sqlite3 config.sqlite "CHỌN * TỪ cài đặt" |grep "SALE_POINT" | awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1' &&
lối ra "

nó in:

sudo sqlite3 config.sqlite CHỌN file1.txt file2.jpg TỪ cài đặt |grep SALE_POINT | awk '{sub(/SALE_POINT/,033[1mPunkt Sprzedaży:033[0m)}1' &&
lối ra 

Giải pháp trực tiếp nhất là thoát khỏi dấu ngoặc kép bên trong, do đó trình bao cục bộ sẽ chuyển chúng qua trình bao trên hệ thống từ xa:

sshpass -p (vượt qua) ssh -t (người dùng)@$1 "
sudo sqlite3 config.sqlite \"CHỌN * TỪ cài đặt\" |grep \"SALE_POINT\" | awk '{sub(/SALE_POINT/,\"\033[1mPunkt Sprzedaży:\033[0m\")}1' &&
lối ra "

Lưu ý rằng bạn phải trốn thoát tất cả các trong số chúng, ngay cả những cái bên trong trích dẫn đơn awk lệnh, bởi vì những dấu ngoặc đơn đó không có ý nghĩa gì đối với trình bao cục bộ.

... nhưng tôi khuyên bạn nên đơn giản hóa điều này một chút. Tôi không thấy lý do nào mà tiếng kêuawk cần được chạy trên hệ thống từ xa chứ không phải hệ thống cục bộ (và lối ra lệnh không làm bất cứ điều gì hữu ích, vì dù sao thì nó cũng sẽ thoát). Vì vậy, bạn có thể di chuyển tiếng kêuawk các lệnh bên ngoài ssh chỉ huy:

sshpass -p (vượt qua) ssh -t (người dùng)@$1 "sudo sqlite3 config.sqlite \"CHỌN * TỪ cài đặt\"" |
    grep "SALE_POINT" |
    awk '{sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m")}1'

Và tôi luôn ghét nhìn thấy tiếng kêu sử dụng trước awk, khi nào awk hoàn toàn có khả năng tự làm mọi thứ:

sshpass -p (vượt qua) ssh -t (người dùng)@$1 "sudo sqlite3 config.sqlite \"CHỌN * TỪ cài đặt\"" |
    awk '/SALE_POINT/ {sub(/SALE_POINT/,"\033[1mPunkt Sprzedaży:\033[0m"); in}'

Tôi cũng khuyên bạn nên trích dẫn kép tất cả các tham chiếu biến (ví dụ: ping "$1" -c 5 Thay vì chỉ ping $1 -c 5) và thay thế điều này:

ping $1 -c 5
nếu [ $? -eq 0 ]; sau đó

chỉ với:

nếu ping "$1" -c 5; sau đó

Và cuối cùng tôi muốn giới thiệu bản inf thay vì tiếng vang -e - đó là cách dễ đoán hơn. bản inf phức tạp hơn một chút để sử dụng -- đối số đầu tiên là một chuỗi định dạng cho nó biết cách in bất kỳ đối số nào còn lại và nó không tự động thêm một dòng mới ở cuối (vì vậy hãy thêm một dòng rõ ràng với \N) -- nhưng nó ít có khả năng bị hỏng do một số thay đổi trong phiên bản shell của tiếng vang (như đã xảy ra với tôi một lúc trước ...). Vì vậy, sử dụng ví dụ:

printf "\e[31;43m%s\e[0m \e[101m%s1\e[0m\n" "Sprawdzanie UstawieÅ" "IP $1"

Ồ, và tôi luôn khuyên bạn nên chạy tập lệnh của mình qua shellcheck.net -- nó sẽ chỉ ra nhiều sai lầm phổ biến và thực hành không tốt.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.