bash thêm dấu ngoặc đơn


12

Tôi có một vấn đề thực hiện kịch bản của tôi.
Khi thực hiện nó trong chế độ gỡ lỗi (bash -x), tôi có thể thấy bash đang thêm dấu ngoặc kép. Do đó kịch bản của tôi thất bại.

Đây là trong kịch bản của tôi:

testvar="\"sudo /home/pi/shared/blink.sh 27 off\""
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 ${testvar}

Đây là đầu ra:

ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 192.168.42.105 '"sudo' /home/pi/shared/blink.sh 27 'off"'

Câu trả lời:


7

Bash đang hiển thị các dấu ngoặc đơn để hiển thị một lệnh là cú pháp đầu vào hợp lệ. Nó không chạy một lệnh chứa các trích dẫn đơn này trong một tham số cho sshlệnh.

ssh  '"sudo' /home/pi/shared/blink.sh 27 'off"'

nói với bạn rằng 4 thông số cuối cùng của lệnh ssh là "sudo, /home/pi/shared/blink.sh, 27off".

Trên máy chủ từ xa, trình nền ssh kết hợp các từ của các lệnh với khoảng trắng là dấu phân cách, vì vậy lệnh từ xa mà bạn đang thực thi là

"sudo /home/pi/shared/blink.sh 27 off"

Điều này cố gắng thực thi một lệnh có tên sudo /home/pi/shared/blink.sh 27 off, tất nhiên là không tồn tại.

Xóa các trích dẫn kép từ định nghĩa của bạn về testvar.

Nó không quan trọng ở đây, nhưng nó có thể quan trọng trong trường hợp thực tế của bạn: thay vì ${testvar}viết "$testvar"(hoặc "${testvar}"nếu bạn muốn nhưng niềng răng là tùy chọn). Luôn đặt dấu ngoặc kép xung quanh các thay thế trừ khi bạn biết lý do tại sao bạn cần phải loại bỏ chúng. "$testvar"mở rộng đến giá trị của biến testvar, trong khi đó, $testvarkhi không có dấu ngoặc kép sẽ xử lý giá trị testvarnhư một danh sách các mẫu hình cầu được phân tách bằng khoảng trắng.


3

Tôi nghĩ rằng bạn nên sử dụng:

testvar="sudo /home/pi/shared/blink.sh 27 off"
ssh -n -q -q -o BatchMode=yes -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o ConnectTimeout=5 $1 "${testvar}"

Điều này làm việc cho tôi:

$ bash -x -c 'testvar="la la la"; echo "${testvar}"'
+ testvar='la la la'
+ echo 'la la la'
la la la

Nhưng nếu tôi viết giống như bạn đã làm, tôi nhận được kết quả sai tương tự:

$ bash -x -c 'testvar="\"la la la\""; echo ${testvar}'
+ testvar='"la la la"'
+ echo '"la' la 'la"'
"la la la"

Các trích dẫn rất quan trọng vì chúng là cơ chế của nhóm để nhóm nhiều từ lại với nhau để tạo thành một đối số duy nhất.
glenn jackman

2

Shell chia giá trị của biến thành các từ. Doublequote nó để ngăn chặn sự chia tách. Thấy sự khác biệt:

t='"a b c"'
set -xv
echo $t
echo "$t"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.