มันเป็นไปได้ที่จะทำให้ตัวแปรภายในซ้อนกันสำหรับวงท้องถิ่น


9
#!/bin/bash
for i in  1 2 3 4
do

#   {
#   local i     ##gives error  local: can only be used in a function
    for i in 1 2 3
    do
    echo "inner loop ----- $i"
    (( i++ ))
    done
#   }
echo $i
done

outout:

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

มันเป็นไปได้ที่จะทำให้ตัวแปรภายในซ้อนกันสำหรับวงท้องถิ่น

คำตอบ:


9

หากคุณเรียกใช้ตัวแปรภายในในเชลล์ย่อยมันจะไม่ส่งผลกระทบต่อตัวแปรด้านนอก:

for i in 1 2 3 4; do
    (
        for i in 1 2 3; do
            echo "inner loop ----- $i"
            (( i++ ))
        done
    )
    echo $i
done

ซึ่งผลลัพธ์ใน:

inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4

1
สิ่งนี้ถูกต้อง แต่โปรดอย่า มันทำให้อ่านยากขึ้นมาก
coteyr

1
การละเมิด subshells มากเกินไปอาจทำให้สคริปต์ช้าลงอย่างเห็นได้ชัด
23013

2
แต่มันยากที่จะอ่านเฉพาะกับคนที่ไม่ได้ละเมิด subshells
user23013

9

มันเป็นไปได้ที่จะทำให้ตัวแปรภายในซ้อนกันสำหรับวงท้องถิ่น

ใช่ แต่ใช้ฟังก์ชั่นเท่านั้น

เนื่องจากบิวอินlocalสามารถอยู่ภายในฟังก์ชันได้เท่านั้นเราจึงต้องจัดเตรียมฟังก์ชันเพื่อให้ตัวแปรiเปลี่ยนขอบเขตจากส่วนกลางเป็นท้องถิ่น:

#!/bin/bash

internalfunction () {
    local i     ### Works as is inside a function
    for i in 1 2 3; do
        echo "inner loop ----- $i"
        (( i++ ))
    done
}

for i in  1 2 3 4; do
    echo $i
    internalfunction
done

$ ./script.sh
1
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
2
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
3
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3
4
inner loop ----- 1
inner loop ----- 2
inner loop ----- 3

1
ถูกต้องและอ่านง่ายขึ้นมาก
coteyr

เพิ่งสังเกตเห็นว่าการใช้เพียงแค่ {} ทำให้ตัวแปร local.declareing การใช้ var declareยังทำให้มันเป็นของท้องถิ่น
munish

1
@munish ไม่เพียง{ }ไม่เพียงพอ ใช่ประกาศทำให้ var ท้องถิ่นภายในฟังก์ชั่น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.