Làm thế nào tôi có thể nối một biến shell với các tham số khác trong các dòng lệnh của mình?


16

Làm thế nào tôi có thể nối một biến shell với các tham số khác trong các dòng lệnh của mình?

Ví dụ,

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > $WEBSITE.sql

Tôi cần phải concatenate .sqlđể$WEBSITE

Câu trả lời:


26

Sử dụng ${ }để bao vây một biến.

Không có dấu ngoặc nhọn:

VAR="foo"
echo $VAR
echo $VARbar

sẽ cho

foo

và không có gì, vì biến $VARbarkhông tồn tại.

Với dấu ngoặc nhọn:

VAR="foo"
echo ${VAR}
echo ${VAR}bar

sẽ cho

foo
foobar

Bao gồm đầu tiên $VARlà không cần thiết, nhưng một thực hành tốt.

Ví dụ của bạn:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword ${WEBSITE} > ${WEBSITE}.sql

Này hoạt động cho bash, zsh, ksh, có lẽ những người khác quá.


3
Điều này hoạt động cho tất cả các vỏ kiểu Bourne (Bourne, POSIX, bash, ksh, zsh), vỏ kiểu C (csh, tcsh) và ngay cả trong cá không có niềng răng. Vì vậy, nó thực sự phổ biến trong số các vỏ unix. Tôi sẽ không gọi niềng răng thực hành tốt. Nhưng tôi gọi một cách có hệ thống bằng cách sử dụng dấu ngoặc kép xung quanh thực tiễn tốt thay thế.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Gilles, tôi sẽ đi xa hơn và nói rằng không sử dụng dấu ngoặc kép xung quanh các thay thế là một thực tế rất tệ .
Stéphane Chazelas

Ngoài ra, hãy cẩn thận mà ${ }không được ghép theo bất kỳ ý nghĩa nào. Ví dụ, ELP=elp && echo $ELP && man --h${EPL}không hoạt động.
foki

4

Chỉ cần nối các nội dung biến với bất kỳ nội dung nào khác mà bạn muốn nối, ví dụ:

/usr/bin/mysqldump --opt -u root --ppassword "$WEBSITE" > "$WEBSITE.sql"

Các trích dẫn kép không liên quan đến ghép nối: ở đây >$WEBSITE.sqlcũng sẽ làm việc. Chúng cần thiết xung quanh các mở rộng biến khi giá trị của biến có thể chứa một số ký tự đặc biệt shell (khoảng trắng và \[?*). Tôi thực sự khuyên bạn nên đặt dấu ngoặc kép xung quanh tất cả các mở rộng biến và thay thế lệnh, nghĩa là luôn luôn viết "$WEBSITE""$(mycommand)".

Để biết thêm chi tiết, xem $ VAR so với $ {VAR} và để trích dẫn hoặc không trích dẫn .


2

Tôi thường sử dụng dấu ngoặc kép, ví dụ echo "$WEBSITE.sql".

Vì vậy, bạn có thể viết nó như sau:

#!/bin/sh
WEBSITE="danydiop" 
/usr/bin/mysqldump --opt -u root --ppassword $WEBSITE > "$WEBSITE.sql"

3
Điều này không hoạt động vì .không phải là một ký tự hợp lệ trong một tên biến; hãy xem câu trả lời của wag nếu bạn muốn nối chuỗi bắt đầu bằng các ký tự hợp lệ (ví dụ: "$ WEBSITEsql" sẽ không hoạt động)
Michael Mrozek
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.