2012-01-26 34 views
6

Tôi là một lập trình viên C/C++ và khá ngu ngốc nói chung (hoặc ít nhất là cách bash làm những điều nó làm cho tôi cảm thấy bối rối) . Tôi không thể quấn đầu của tôi xung quanh process substitution.Bash thiết lập một biến toàn cầu bên trong một vòng lặp và giữ lại giá trị của nó - Hoặc quá trình thay thế cho núm vú giả

Tôi cần xác định một boolean toàn cầu, đặt nó ở đâu đó trong một vòng lặp và sử dụng nó trong phạm vi toàn cục. Có thể ai đó hãy giải thích theo cách đơn giản nhất có thể làm thế nào để thích ứng với mã dưới đây để cho phép tôi đạt được trường hợp sử dụng của mình, đơn giản, đủ để tôi không phải mâu thuẫn bộ não của tôi vào ngày mai để thử và nắm bắt sự thay thế quy trình.

# DEFINE HERE 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -d "data$i" ]; then 
# SET HERE 
       echo "data$i does not exist. Creating..."; 
       mkdir data$i 
     fi 
done 

# TEST AND USE HERE 

thành thật mà nói, tôi không nghĩ rằng bash tùy thuộc vào nhiệm vụ .... khối tiếp theo trông như thế này.

echo "-------------------------------------------------------------------------------" 
echo "checking the state of potentially running daemons" 
for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -e "data$i/mongod.lock" ] ; then 
       echo "[no lock file] mongod process $i does not exist" 
     else 
       echo "[lock file exists] process $i lock file exists " 
       I_PID=`cat data$i/mongod.lock` 

       if [ ! ${I_PID} ]; then 
         echo " [GOOD] lock pid empty" 
       elif [ "`ps -p ${I_PID} | grep ${I_PID}`" ]; then 
         echo " [GOOD] data1 pid: ${I_PID} running" 
       else 
         echo "[PROBABLY FATAL] data1 pid: ${I_PID} not running." 
       fi 
     fi 
done 
echo "-------------------------------------------------------------------------------" 

Điều tôi bây giờ cần là một chuỗi cấu trúc toàn cầu để tôi có thể lặp lại chúng và thực hiện hành động có điều kiện để khởi chạy đúng daemon: /.

Might just use libc and do this stuff in lua, lý do duy nhất tôi giữ lại được cần phải cài đặt đá, tôi không thích ad-hoc kho đang nôn bất cứ điều gì họ muốn trên máy tính của tôi: D

Trả lời

1

tôi có thể có misundestood nhưng ...

bool=false; 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
    if [ ! -d "data$i" ]; then 
      bool=true; 
      echo "data$i does not exist. Creating..."; 
      mkdir data$i 
    fi 
done 

if [ $bool = true ]; then 
    ... 
fi 

Đây có phải là những gì bạn muốn không?

+0

có, đó sẽ là lần đầu tiên của tôi muốn. Mong muốn thứ hai của tôi là để theo dõi một mảng MxN của bools. –

8

Điều quan trọng cần hiểu là: quy trình con được sinh ra với môi trường riêng và không thể ảnh hưởng đến các biến của cha mẹ. Nếu bạn đặt một biến trong một tiến trình con, thì giá trị của biến trong cha mẹ sẽ không bị ảnh hưởng. Đây thực sự là hai biến khác nhau chỉ có cùng tên.

Điều thứ hai cần hiểu là khi bash chạy lệnh dưới dạng tiến trình con. Có hai trường hợp liên quan đến câu hỏi:

  1. Mỗi quá trình được kết nối bằng một đường ống | là con của vỏ hiện tại.
  2. Chạy một lệnh nội trang đơn có chuyển hướng (ví dụ: <) sẽ không sinh ra quá trình con.

Đây là một phiên đơn giản mà thể hiện cách sau đây:

$ somevar=initial 
$ echo test1 | read somevar 
$ echo $somevar 
initial 
$ read somevar < <(echo test2) 
$ echo $somevar 
test2 

Các read đầu tiên là một quá trình con và do đó somevar trong vỏ chính không thay đổi. Các read thứ hai được thực hiện bởi chính vỏ và do đó somevar được cập nhật.

Điều này có nghĩa rằng mã của bạn sẽ làm việc như bạn mong đợi, trừ khi bạn thêm một đường ống ở phía trước hoặc sau for vòng lặp, tức là làm việc này khi bạn muốn nó:

# DEFINE HERE 
SOMEVAR=0 
DAEMON_COUNT=10 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -d "data$i" ]; then 
# SET HERE 
       SOMEVAR=10 
       echo "data$i does not exist. Creating..."; 
       mkdir data$i 
     fi 
done 

# TEST AND USE HERE 
echo ${SOMEVAR}  # This displays 10 
+0

không phải là cấu trúc 'for' ngầm sinh ra một tiến trình con? Đó là hành vi tôi đã trải qua khi tôi thử nó. –

+0

Không. Do đó mã của bạn thực sự ổn. Tránh đường ống, mặc dù :-) –

+0

nó in một số không trên máy của tôi: ( –

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