Biến IFS được sử dụng mỗi khi shell thực hiện một tác vụ gọi là tách từ . Các trường hợp phổ biến nhất được sử dụng là sau khi mở rộng tham số (ví dụ $var
) hoặc thay thế lệnh (ví dụ $(some-command)
hoặc backticks không dùng nữa) trong một lệnh. Ở đây nếu bản mở rộng chứa bất kỳ IFS
ký tự nào , thì nó sẽ chia thành các 'từ' khác nhau trước khi lệnh được xử lý. Thực tế, điều này có nghĩa là các ký tự này phân chia văn bản được thay thế thành các đối số khác nhau (bao gồm tên của lệnh nếu biến được chỉ định trước).
Do đó, lý do cho giá trị mặc định IFS
là khoảng trắng, tab và dòng mới là vì đây là các ký tự khoảng trắng thường được dự kiến sẽ phân tách một từ.
Một cách để ngăn chặn việc chia tách từ xảy ra là sử dụng dấu ngoặc kép xung quanh phần mở rộng ( "$var"
) - thực tế bạn đã thực hiện điều này trong câu hỏi của mình. Nếu bạn không làm điều này thì sẽ không có đầu ra echo
vì nó sẽ không có đối số, chỉ có các ký tự tách các đối số.
Cũng lưu ý rằng hai vị trí phân tách từ không xảy ra sau khi mở rộng tham số bằng phép gán biến (ví dụ var=$othervar
và var=$(somecommand)
là ok) và trong [[ ]]
cấu trúc ( [[ $var = $othervar ]]
là ok, nhưng [ $var = $othervar ]
nên được trích dẫn).
Cuối cùng, như một người khôn ngoan đã từng chỉ ra cho tôi, một quan niệm sai lầm phổ biến là việc ngăn chặn việc chia tách từ là lý do duy nhất để trích dẫn một biến. Không, trích dẫn cũng ngăn chặn việc mở rộng tên đường dẫn hoặc mở rộng toàn cầu vì nó được biết đến nhiều hơn. Nếu một biến chứa các ký tự toàn cục như thế *
thì chúng có thể được mở rộng thành tên tệp khi biến được sử dụng không được trích dẫn trong lệnh. Ví dụ: xem xét:
var=*
echo $var
Điều này sẽ hiển thị tên của các tập tin trong thư mục hiện tại.
Như Stephane chỉ ra bên dưới , thứ tự các ký tự bên trong IFS
rất có ý nghĩa khi mở rộng "$*"
. Từ bash
trang người đàn ông:
"$*" is equivalent to "$1c$2c...", where c is the first character of the value of
the IFS variable. If IFS is unset, the parameters are separated by spaces. If
IFS is null, the parameters are joined without intervening separators.
Để biết thêm ví dụ về phân tách từ, vui lòng xem câu trả lời này - https://unix.stackexchange.com/a/118444/48083
$IFS
cũng được sử dụng trong"$*"
đó là lý do tại sao thứ tự quan trọng.