Đặt IFS cho tập lệnh bash


7

Trường hợp điển hình là IFS= read.
Chủ đề được giải thích rất rõ trong chủ đề này:
tại sao lại thiết lập một biến trước một lệnh hợp pháp trong bash?
Để có một bức tranh hoàn chỉnh, tôi rất biết ơn nếu các bạn có thể giải thích lý do tại sao đoạn script sau không hoạt động như (tôi) mong đợi.
my_script:

#!/bin/bash

echo "$var1"
echo -n "$IFS" | xxd -p
echo "$var2"

exit 0

gọi my_script:

var1=foo IFS= var2=bar my_script

đầu ra:

foo
20090a
bar

Như bạn có thể thấy IFSlà không thay đổi, vẫn được đặt làm mặc định.
Làm thế nào để readcó được các tùy chỉnh IFSkhi được gọi là IFS= read?
Cảm ơn bạn trước


Xem thêm Khi nào tôi có thể sử dụng IFS tạm thời để tách trường? (nhưng, như câu trả lời của Thomas Dickey giải thích, bạn sẽ không đi xa đến thế).
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


11

Ví dụ không được đặt IFStrong tập lệnh, vì bash không cho phép nhập IFStừ môi trường, theo một nhận xét trong variables.c:

  /* Don't allow IFS to be imported from the environment. */
  temp_var = bind_variable ("IFS", " \t\n", 0);
  setifs (temp_var); 

Tất nhiên, các lệnh tích hợp và không sử dụng tập lệnh nhận được sự gán cho IFS, nhưng hãy nhớ rằng IFSchỉ áp dụng cho việc tách từ :

Shell xử lý mỗi ký tự $IFSnhư là một dấu phân cách và chia kết quả của các phần mở rộng khác thành các từ bằng cách sử dụng các ký tự này làm dấu kết thúc trường. Nếu IFSlà unset, hoặc giá trị của nó là chính xác <space><tab><newline>, mặc định, sau đó trình tự <space>, <tab><newline>vào lúc bắt đầu và kết thúc của các kết quả của việc mở rộng trước đó được bỏ qua, và bất kỳ chuỗi IFSký tự không ở đầu hoặc cuối phục vụ để từ phân định. Nếu IFScó một giá trị khác với mặc định, thì các chuỗi không gian và tab ký tự khoảng trắng sẽ bị bỏ qua ở đầu và cuối của từ, miễn là ký tự khoảng trắng nằm trong giá trị của IFS(một IFSký tự khoảng trắng). Bất kỳ ký tự nào trong IFSđó không phải là khoảng trắng IFS, cùng với bất kỳ ký tự liền kề nàoIFSký tự khoảng trắng, phân định một trường. Một chuỗi các IFSký tự khoảng trắng cũng được coi là một dấu phân cách. Nếu giá trị IFSlà null, không có sự phân tách từ nào xảy ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.