คุณสามารถแสดงผลของการอ้างอิงตัวแปรprintf
ได้ตลอดเวลา
การแยกคำทำได้เมื่อvar1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
ยกมาดังนั้นจึงไม่มีการแยกคำ:
$ printf '[%s]\n' "$var1"
[hello world]
คำที่แยกออกมาvar1
ข้างใน$()
เทียบเท่ากับecho "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
ไม่มีการแยกคำvar1
ไม่มีปัญหากับการไม่อ้างถึง$()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
คำแยกvar1
อีกครั้ง:
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
การอ้างอิงทั้งสองวิธีที่ง่ายที่สุดเพื่อให้แน่ใจ
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
ปัญหาการวนรอบ
การไม่อ้างตัวแปรสามารถนำไปสู่การขยายตัวของเนื้อหาได้
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
โปรดทราบว่าสิ่งนี้เกิดขึ้นหลังจากตัวแปรถูกขยายเท่านั้น ไม่จำเป็นต้องอ้างกลมระหว่างการมอบหมาย:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
ใช้set -f
เพื่อปิดใช้งานลักษณะการทำงานนี้:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
และset +f
เพื่อเปิดใช้งานอีกครั้ง:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]