Trong chương trình sau, nếu tôi đặt biến $foo
thành giá trị 1 bên trong if
câu lệnh đầu tiên , nó hoạt động theo nghĩa là giá trị của nó được ghi nhớ sau câu lệnh if. Tuy nhiên, khi tôi đặt cùng một biến thành giá trị 2 bên trong một giá trị bên if
trong một while
câu lệnh, nó sẽ bị quên sau while
vòng lặp. Nó hoạt động giống như tôi đang sử dụng một số loại bản sao của biến $foo
trong while
vòng lặp và tôi chỉ sửa đổi bản sao cụ thể đó. Đây là một chương trình thử nghiệm hoàn chỉnh:
#!/bin/bash
set -e
set -u
foo=0
bar="hello"
if [[ "$bar" == "hello" ]]
then
foo=1
echo "Setting \$foo to 1: $foo"
fi
echo "Variable \$foo after if statement: $foo"
lines="first line\nsecond line\nthird line"
echo -e $lines | while read line
do
if [[ "$line" == "second line" ]]
then
foo=2
echo "Variable \$foo updated to $foo inside if inside while loop"
fi
echo "Value of \$foo in while loop body: $foo"
done
echo "Variable \$foo after while loop: $foo"
# Output:
# $ ./testbash.sh
# Setting $foo to 1: 1
# Variable $foo after if statement: 1
# Value of $foo in while loop body: 1
# Variable $foo updated to 2 inside if inside while loop
# Value of $foo in while loop body: 2
# Value of $foo in while loop body: 2
# Variable $foo after while loop: 1
# bash --version
# GNU bash, version 4.1.10(4)-release (i686-pc-cygwin)
SC2030: Modification of foo is local (to subshell caused by pipeline).