2009-05-08 29 views
53

Tôi đã thử các hình thức sau đây trong một kịch bản bash:Làm thế nào để sử dụng một biến môi trường bên trong một chuỗi trích dẫn trong Bash

#!/bin/bash 
svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS" 

Nhưng tôi không thể có được cú pháp để mở rộng một cách chính xác môi trường COLUMNS biến.

Tôi đã thử các hình thức sau:

svn diff [email protected] --diff-cmd /usr/bin/diff -x '-y -w -p -W $COLUMNS' 

svn diff [email protected] --diff-cmd /usr/bin/diff -x '-y -w -p -W ${COLUMNS}' 

eval svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS" 

Gợi ý?

+0

để các ví dụ đó tạo ra trong trường hợp của bạn là gì? Và bạn muốn họ sản xuất cái gì? –

+0

lệnh bên ngoài tập lệnh đang hoạt động? – dfa

+0

Bạn đã thử 'svn diff $ @ --diff-cmd/usr/bin/diff -x" -y -w -p -W "" $ COLUMNS "' –

Trả lời

11

Nếu không chắc chắn, bạn có thể sử dụng theo yêu cầu 'cols' trên thiết bị đầu cuối, và quên COLUMNS:

COLS=$(tput cols) 
+0

Vì lý do gì, đây là giải pháp duy nhất tôi có thể làm việc trên trang này (tính đến ngày 11 tháng 5 10:38 ET). Cảm ơn – Jamie

+0

Trong trường hợp của tôi: lệnh -param "$ {VARIABLE} _ *" đã thực hiện thủ thuật. – danger89

0

Tập lệnh sau hoạt động cho tôi cho nhiều giá trị $COLUMNS. Tôi tự hỏi nếu bạn không thiết lập COLUMNS trước cuộc gọi này?

#!/bin/bash 
COLUMNS=30 
svn diff [email protected] --diff-cmd /usr/bin/diff -x "-y -w -p -W $COLUMNS" 

Bạn có thể echo $COLUMNS bên trong tập lệnh để xem có được đặt chính xác không?

+0

Boo, hiss re: unquoted '$ @' - chia tách một tham số đơn '' hai từ "' thành hai tham số riêng biệt, 'hai' và' từ'. Nên là '" $ @ "' để chuyển danh sách đối số thông qua chính xác như nó đã được đưa ra. –

0

Bạn đang làm đúng, vì vậy tôi đoán có điều gì đó khác là do lỗi (không phải là COLUMNS xuất khẩu?).

Một mẹo để gỡ lỗi các trường hợp này là tạo một lệnh chuyên biệt (đóng cửa cho các ngôn ngữ lập trình). Tạo một kịch bản shell tên diff-cột thực hiện:

exec /usr/bin/diff -x -y -w -p -W "$COLUMNS" "[email protected]" 

và chỉ sử dụng

svn diff "[email protected]" --diff-cmd diff-columns 

Bằng cách này mã của bạn là sạch hơn để đọc và mô-đun hơn (từ trên xuống cách tiếp cận), và bạn có thể kiểm tra mã diff-cột riêng biệt (cách tiếp cận từ dưới lên).

+0

Dòng lệnh được phân tích cú pháp trước khi quá trình được chia nhỏ, vì vậy không xuất COLUMNS không thể là vấn đề. –

+1

Ông nói mã của mình trong một phần của một kịch bản bash, do đó nó có thể là vấn đề. –

12

Lưu ý rằng COLUMNS là:

  1. KHÔNG một biến môi trường. Nó là một tham số bash thông thường được thiết lập bởi chính bash.
  2. Đặt tự động sau khi nhận được tín hiệu SIGWINCH.

Đó là điểm thứ hai thường có nghĩa là biến COLUMNS của bạn sẽ chỉ được thiết lập trong tương tác shell của bạn, không trong một kịch bản bash.

Nếu của stdin kịch bản của bạn được kết nối với thiết bị đầu cuối của bạn, bạn có thể tự tìm kiếm chiều rộng của thiết bị đầu cuối của mình bằng cách yêu cầu thiết bị đầu cuối của bạn:

tput cols 

Và để sử dụng trong lệnh SVN của bạn:

svn diff "[email protected]" --diff-cmd /usr/bin/diff -x "-y -w -p -W $(tput cols)" 

(Lưu ý: bạn nên báo giá"[email protected]" và tránh xa eval ;-))

+0

Cảm ơn thông tin; biết những gì đang xảy ra mang lại một cảm giác của bệnh về vấn đề này. – Jamie

265

Chỉ cần một lưu ý/tóm tắt nhanh cho bất kỳ ai đến đây thông qua Google đang tìm câu trả lời cho câu hỏi chung được hỏi trong tiêu đề (như tôi). Bất kỳ điều nào sau đây đều có tác dụng để truy cập vào các biến trình bao bên trong dấu ngoặc kép:

echo "$VARIABLE" 
echo "${VARIABLE}" 

Sử dụng dấu nháy đơn là vấn đề chính. Theo số Bash Reference Manual:

Ký tự kèm theo trong dấu nháy đơn (') duy trì giá trị bằng chữ của mỗi ký tự trong dấu ngoặc kép. Một trích dẫn duy nhất có thể không xảy ra giữa các dấu nháy đơn, ngay cả khi trước dấu gạch chéo ngược. [...] Bao gồm các ký tự trong dấu ngoặc kép (") duy trì giá trị bằng chữ của tất cả các ký tự trong dấu ngoặc kép, ngoại trừ $, `, \ và khi mở rộng lịch sử được bật, !. Các ký tự $ và `giữ lại ý nghĩa đặc biệt của chúng trong dấu ngoặc kép (xem phần mở rộng của Shell). Dấu gạch chéo ngược chỉ giữ lại ý nghĩa đặc biệt của nó khi được theo sau bởi một trong các ký tự sau: $, `, ", \ hoặc dòng mới. Trong dấu ngoặc kép, dấu gạch chéo ngược được theo sau bởi một trong các ký tự này bị xóa. Dấu gạch chéo ngược trước các ký tự không có ý nghĩa đặc biệt sẽ không được sửa đổi. Trích dẫn kép có thể được trích dẫn trong dấu ngoặc kép bằng cách đặt trước dấu gạch chéo ngược. Nếu được bật, mở rộng lịch sử sẽ được thực hiện trừ khi xuất hiện một dấu ngoặc kép xuất hiện bằng dấu gạch chéo ngược !. Dấu gạch chéo ngược trước ! không bị xóa. Các tham số đặc biệt *@ có ý nghĩa đặc biệt khi trong dấu ngoặc kép (xem Shell Parameter Expansion).

Trong trường hợp cụ thể được hỏi trong câu hỏi, $ COLUMNS là một biến đặc biệt có thuộc tính không chuẩn (xem câu trả lời của lhunath ở trên).

+12

Trong trường hợp dấu nháy đơn, có thể cách giải quyết này sẽ giúp: ''trước'" $ biến "'sau'' (như đã nêu trong câu trả lời này: http://stackoverflow.com/a/13802438/2254346) – MakisH

+1

Chúa chết tiệt nó, tôi không bao giờ biết điều này về dấu nháy đơn! Chi phí cho tôi một buổi chiều ... –

Các vấn đề liên quan