Câu trả lời:
$(command)
là lệnh thay thế Như bạn có vẻ hiểu, nó chạy command
, nắm bắt đầu ra của nó và chèn nó vào dòng lệnh có chứa $(…)
; ví dụ,
$ ls -ld $(date +%B).txt
-rwxr-xr-x 1 Noob Noob 867 Jul 2 11:09 July.txt
${parameter}
Là thay thế tham số của NỀN TẢNG. Rất nhiều thông tin có thể được tìm thấy trong trang man của shell, bash (1) , dưới tiêu đề Mở rộng Thông số của Thông số :
${parameter}
Giá trị của tham số được thay thế. Các dấu ngoặc được yêu cầu khi tham số là tham số vị trí có nhiều hơn một chữ số hoặc khi tham số được theo sau bởi một ký tự không được hiểu là một phần của tên của nó.
Để biết thông số vị trí, xem Thông số vị trí của người dùng , bên dưới. Trong cách sử dụng phổ biến nhất của nó, như thể hiện trong các câu trả lời khác,
parameter
là một tên biến. Biểu ${…}
mẫu, như đã nêu ở cuối đoạn trên, cho phép bạn nhận giá trị của một biến (nghĩa là ) và theo dõi nó ngay lập tức bằng một chữ cái, chữ số hoặc gạch dưới:$variable_name
$ động vật = mèo $ echo $ động vật # Không có biến số như động vật trên mạng. $ echo $ {động vật} s mèo $ echo $ động vật_ thực phẩm # Không có biến nào như là động vật ăn thịt $ echo $ {động vật} _ thực phẩm thức ăn cho mèo
Bạn cũng có thể làm điều này với dấu ngoặc kép:
$ echo "$ động vật" s mèo
Hoặc, như một bài tập trong các tùy chọn, bạn có thể sử dụng biến thứ hai:
$ số nhiều = s $ echo $ động vật $ số nhiều mèo
Nhưng đây chỉ là bước 1. Đoạn tiếp theo trong trang man rất thú vị, mặc dù hơi khó hiểu:
Nếu ký tự đầu tiên của tham số
là dấu chấm than ( !
), thì mức độ biến đổi được đưa ra. Bash sử dụng giá trị của biến được hình thành từ phần còn lại của tham số
làm tên của biến; biến này sau đó được mở rộng và giá trị đó được sử dụng trong phần còn lại của sự thay thế, thay vì giá trị của chính tham số . Điều này được gọi là mở rộng gián tiếp .
... (trường hợp ngoại lệ) ...
Các dấu chấm than ngay lập tức phải tuân theo cú đúp trái để giới thiệu về mình.
Tôi không chắc làm thế nào tôi có thể làm cho điều này rõ ràng hơn ngoại trừ bằng ví dụ:
$ động vật = mèo $ echo $ động vật con mèo $ cat = tabby $ echo $ mèo tabby $ echo $ {! động vật} tabby # Nếu $ động vật là mèo cat , thì $ {! động vật} là $ cat , tức là tabbyby
Vì vậy, hãy gọi đó là bước 1½. Có rất nhiều điều thú vị mà bạn có thể làm như bước 2:
$ động vật = mèo $ echo $ {# động vật}Độ dài chuỗi 3 # $ echo $ {động vật / at / ow} bò # Thay thế
Bạn không thể làm bất cứ những điều đó mà không {
... }
niềng răng.
Thông số vị trí
Hãy xem xét ví dụ nhân tạo này :
$ mèo myecho.sh lặp lại $ 1 $ 2 $ 3 $ 4 $ 5 $ 6 $ 7 $ 8 $ 9 $ 10 $ 11 $ 12 $ 13 $ 14 $ 15 $ ./myecho.sh Hey diddle diddle, The cat and the fiddle, The cow jump over the moon. Hey diddle diddle diddle, The cat and the fiddle, The Hey0 Hey1 Hey2 Hey3 Hey4 Hey5
vì vỏ không hiểu $10
, $11
vv Nó đối xử $10
như thể nó là ${1}0
. Nhưng nó hiểu ${10}
, ${11}
v.v., như đã đề cập trong trang con người (một tham số vị trí có nhiều hơn một chữ số).
Nhưng đừng thực sự viết kịch bản như thế; có nhiều cách tốt hơn để đối phó với danh sách đối số dài.
Ở trên (cùng với nhiều hình thức xây dựng hơn) được thảo luận với độ dài lớn hơn trong trang man của shell, bash (1) .${parameter…something_else}
Lưu ý về báo giá
Lưu ý rằng bạn phải luôn trích dẫn các biến shell trừ khi bạn không có lý do chính đáng và bạn chắc chắn rằng bạn biết bạn đang làm gì. Ngược lại, trong khi niềng răng có thể quan trọng, chúng không quan trọng bằng dấu ngoặc kép.
$ filename = "vườn ươm rhyme.txt" $ ls -ld $ {tên tệp} ls: không thể truy cập vườn ươm: Không có tập tin hoặc thư mục như vậy ls: không thể truy cập rhyme.txt: Không có tệp hoặc thư mục như vậy $ ls -ld "$ tên tệp" -rwxr-xr-x 1 Noob Noob 5309 ngày 2 tháng 7 11:09 vườn ươm rhyme.txt
Điều đó cũng áp dụng cho các tham số vị trí (ví dụ: đối số dòng lệnh; ví dụ "$1"
:) và cả thay thế lệnh:
$ ls -ld $ (ngày "+% B% Y"). txt ls: không thể truy cập tháng 7: Không có tập tin hoặc thư mục như vậy ls: không thể truy cập 2015.txt: Không có tệp hoặc thư mục như vậy $ ls -ld "$ (ngày" +% B% Y "). txt" -rwxr-xr-x 1 Noob Noob 687 ngày 2 tháng 7 11:09 tháng 7 năm 2015.txt
Xem Bash dấu ngoặc kép unescaped trên thay thế lệnh
cho một luận ngắn gọn về sự tương tác giữa dấu ngoặc kép và $(
... )
.
!
.
${!animal}
Thực sự là đề cập đến biến $cat
thay vì giá trị con mèo. Có, đó chính xác là vấn đề. Làm thế nào để / tại trở thành một "c" trong tiếng vang $ {động vật / tại / ow}? / tại không trở thành "c"; Con mèo con trở thành con bò con khi mà người ta đã thay thế bằng con gà trống.
Trong ví dụ của bạn, $ var và $ {var} là giống hệt nhau. Tuy nhiên, dấu ngoặc nhọn rất hữu ích khi bạn muốn mở rộng biến trong chuỗi:
$ string=foo
$ echo ${string}bar
foobar
$ echo $stringbar
$
Do đó, dấu ngoặc nhọn cung cấp một phương tiện thay thế biến để lấy tên của biến mới, chính nó được thay thế.
Tôi thường thấy nó phổ biến hơn trong chuỗi. Một cái gì đó như thế này sẽ không hoạt động:
var="a"
echo "$varRAW_STRING"
Nhưng điều này sẽ:
var="a"
echo "${var}RAW_STRING"
Như bạn đã nói chính xác, $()
được sử dụng để thực thi một lệnh:
dir_contents=$(ls)
Bạn cũng có thể sử dụng backticks, nhưng tôi thấy $()
linh hoạt hơn. Đối với một điều, backticks không thể (dễ dàng) lồng nhau.
date_directory=`ls `date '+%Y-%m-%d'`` # Makes no sense
date_directory=$(ls $(date '+%Y-%m-%d')) # Much better
date_directory=`ls \`date '+%Y-%m-%d'\``
. Nhưng nó xấu kinh khủng; $(…)
rõ ràng hơn và dễ sử dụng hơn.
`…`
là những (chỉ) cú pháp để thay thế lệnh trong nhiều năm trước khi $(…)
được phát minh, vì vậy bạn không cần phải tưởng tượng bất cứ điều gì - những người đã làm nó.
${
variable_name
}