2010-02-22 36 views
102

Tôi gặp sự cố khi đặt nội dung của lệnh pwd vào biến hệ vỏ mà tôi sẽ sử dụng sau.Làm thế nào để gán đầu ra của lệnh Bash cho một biến?

Dưới đây là mã shell của tôi (vòng lặp không chỉ dừng lại):

#!/bin/bash 
pwd= `pwd` 
until [ $pwd = "/" ] 
    do 
     echo $pwd 
     ls && cd .. && ls 
     $pwd= `pwd` 
    done 

bạn có thể nhận ra sai lầm của tôi, xin vui lòng?

+0

Bạn cũng có thể thêm lối thoát hiểm vào vòng lặp của mình trong trường hợp xảy ra sự cố. ví dụ. 'i = 0' nằm trong vòng lặp. sau đó bên trong, 'i = $ i + 1'. Và sau đó cũng bên trong vòng lặp, thêm một cái gì đó như 'nếu [$ i> 25] sau đó; phá vỡ; endif; 'Tôi không chắc chắn về cú pháp phá vỡ vòng lặp trong các kịch bản lệnh shell, nhưng nó phải giống như thế. –

Trả lời

191

Hãy thử:

pwd=`pwd` 

hoặc

pwd=$(pwd) 

Chú ý không có khoảng trắng sau dấu bằng.

Cũng như ông Weiss chỉ ra; bạn không chỉ định cho $pwd, bạn chỉ định cho pwd.

+0

tuyệt vời, cảm ơn bạn rất nhiều :) sẽ definatly nhớ rằng không có khoảng trắng và $ ký – Zenet

+1

hoạt động tuyệt vời, nhưng những gì hiện '$()' có nghĩa là trong '$ (pwd)'? –

+3

@AwQiruiGuo '$()' trong bash chỉ thay thế chính nó bằng đầu ra của lệnh được thực hiện với các dấu ngoặc; do đó, '$ (pwd)' sẽ mở rộng thành '/ home/ubuntu', làm cho phép gán tương đương với:' pwd = '/ home/ubuntu'' –

19

Trong vỏ bạn gán cho một biến mà không có sự đồng USD-sign:

TEST=`pwd` 
echo $TEST 

đó là tốt hơn (và có thể được lồng vào nhau) nhưng không phải là cầm tay như backtics:

TEST=$(pwd) 
echo $TEST 

Luôn luôn nhớ : ký hiệu đô la chỉ được sử dụng khi đọc một biến.

+1

Hãy nhớ sử dụng chữ thường cho tên biến của bạn: http://stackoverflow.com/questions/673055/correct-bash-and-shell-script-variable- viết hoa – Langston

7

Bạn cũng có thể thực hiện các lệnh phức tạp hơn, chỉ để làm tròn các ví dụ ở trên. Vì vậy, giả sử tôi muốn nhận được số lượng các quy trình đang chạy trên hệ thống và lưu trữ nó trong biến số $ {NUM_PROCS}.

Tất cả những gì bạn phải làm là tạo ra đường dẫn lệnh và nội dung đầu ra của nó (số đếm quy trình) vào biến.

Nó trông giống như sau:

NUM_PROCS=$(ps -e | sed 1d | wc -l) 

Tôi hy vọng rằng sẽ giúp thêm một số thông tin hữu ích để thảo luận này.

14

Trong trường hợp cụ thể này, lưu ý rằng bash có một biến gọi là PWD chứa thư mục hiện tại: $PWD tương đương với `pwd`. (Vì vậy, làm vỏ khác, đây là một standard feature.) Vì vậy, bạn có thể viết kịch bản của bạn như thế này:

#!/bin/bash 
until [ "$PWD" = "/" ]; do 
    echo "$PWD" 
    ls && cd .. && ls 
done 

Lưu ý việc sử dụng dấu ngoặc kép quanh tài liệu tham khảo khác nhau. Chúng là cần thiết nếu biến (ở đây, thư mục hiện tại) chứa khoảng trống hoặc ký tự đại diện (\[?*), bởi vì trình bao chia tách kết quả của các mở rộng biến thành các từ và thực hiện các cụm từ này. Luôn báo giá mở rộng biến số "$foo" và thay thế lệnh "$(foo)" (trừ khi bạn biết rõ mình không phải).

Trong trường hợp chung, như câu trả lời khác đã đề cập đã:

  • Bạn không thể sử dụng khoảng trắng xung quanh dấu bằng trong chuyển nhượng: var=value, không var = value
  • Các $ có nghĩa là “mất giá trị của biến này ", vì vậy bạn không sử dụng nó khi chỉ định: var=value, không phải $var=value .
1

Dưới đây là kịch bản của bạn ...

DIR=$(pwd) 
echo $DIR 
while [ "$DIR" != "/" ]; do 
    cd .. 
    DIR=$(pwd) 
    echo $DIR 
done 

Lưu ý các khoảng trắng, sử dụng dấu ngoặc kép, và các dấu hiệu $.

+0

Hãy nhớ sử dụng chữ thường cho tên biến của bạn: http://stackoverflow.com/questions/673055/correct-bash-and-shell-script-variable-capitalization – Langston

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