ในบางเชลล์ (รวมถึงbash):
IFS=: command eval 'p=($PATH)'
(ด้วยbash, คุณสามารถละเว้นcommandถ้าไม่อยู่ในการจำลอง sh / POSIX) แต่ระวังว่าเมื่อใช้ตัวแปรที่ไม่ได้กล่าวถึงคุณจำเป็นต้องใช้โดยทั่วไปset -fและไม่มีขอบเขตภายในสำหรับเชลล์ส่วนใหญ่
ด้วย zsh คุณสามารถทำได้:
(){ local IFS=:; p=($=PATH); }
$=PATHคือการบังคับให้แยกคำที่ไม่ได้ทำไว้เป็นค่าเริ่มต้นในzsh(การวนตามการขยายตัวของตัวแปรไม่ได้ทำเช่นนั้นดังนั้นคุณไม่ต้องการset -fยกเว้นในการจำลอง sh)
(){...}(หรือfunction {...}) เรียกว่าฟังก์ชั่นที่ไม่ระบุชื่อและโดยทั่วไปจะใช้ในการตั้งค่าขอบเขตท้องถิ่น ด้วยเชลล์อื่น ๆ ที่สนับสนุนขอบเขตโลคัลในฟังก์ชันคุณสามารถทำสิ่งที่คล้ายกับ:
e() { eval "$@"; }
e 'local IFS=:; p=($PATH)'
ที่จะใช้ขอบเขตท้องถิ่นสำหรับตัวแปรและตัวเลือกในเปลือกหอย POSIX คุณยังสามารถใช้ฟังก์ชั่นที่มีให้ ณhttps://github.com/stephane-chazelas/misc-scripts/blob/master/locvar.sh จากนั้นคุณสามารถใช้มันเป็น:
. /path/to/locvar.sh
var=3,2,2
call eval 'locvar IFS; locopt -f; IFS=,; set -- $var; a=$1 b=$2 c=$3'
(โดยวิธีการที่ไม่สามารถแยก$PATHวิธีดังกล่าวข้างต้นยกเว้นในzshเช่นเดียวกับเชลล์อื่น ๆ IFS เป็นตัวคั่นฟิลด์ไม่ใช่ตัวคั่นฟิลด์)
IFS=$'\n' a=($str)
เป็นเพียงการมอบหมายสองอย่างและอีกอันหนึ่งเหมือนa=1 b=2กัน
หมายเหตุของคำอธิบายเกี่ยวกับvar=value cmd:
ใน:
var=value cmd arg
รันเปลือก/path/to/cmdในกระบวนการใหม่และบัตรcmdและargในargv[]และในvar=value envp[]นั่นไม่ใช่การกำหนดตัวแปร แต่เป็นการส่งผ่านตัวแปรสภาพแวดล้อมไปยังคำสั่งที่ดำเนินการ ในเชลล์ Bourne หรือ Korn ด้วยset -kคุณยังสามารถเขียนมันcmd var=value argได้
ตอนนี้ที่ใช้ไม่ได้กับ builtins หรือฟังก์ชั่นที่ไม่ได้ดำเนินการ ใน Bourne shell, in var=value some-builtin, varจบลงด้วยการตั้งค่าในภายหลังเช่นvar=valueเดียวกับคนเดียว นั่นหมายถึงตัวอย่างที่พฤติกรรมของvar=value echo foo(ซึ่งไม่มีประโยชน์) แตกต่างกันไปขึ้นอยู่กับว่าechoมีการสร้างขึ้นหรือไม่
POSIX และ / หรือkshการเปลี่ยนแปลงที่ในการที่ว่าพฤติกรรมของบอร์นจะเกิดขึ้นสำหรับหมวดหมู่ของ builtins ที่เรียกว่าbuiltins พิเศษ evalเป็น builtin พิเศษreadไม่ได้ สำหรับ builtin ที่ไม่ใช่แบบพิเศษให้var=value builtinตั้งค่าvarเฉพาะสำหรับการเรียกใช้งานของ builtin ซึ่งทำให้มันทำงานคล้ายกับเมื่อมีการเรียกใช้คำสั่งภายนอก
commandคำสั่งที่สามารถใช้ในการลบพิเศษแอตทริบิวต์ของผู้ที่builtins พิเศษ สิ่งที่ POSIX มองข้ามคือสำหรับevalและ.บิวด์อินนั่นหมายความว่าเชลล์จะต้องใช้ตัวแปรสแต็ก (แม้ว่าจะไม่ได้ระบุlocalหรือtypesetคำสั่งการ จำกัด ขอบเขต) เนื่องจากคุณสามารถทำได้:
a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a
หรือแม้กระทั่ง:
a=1 command eval myfunction
ด้วยmyfunctionการเป็นฟังก์ชั่นการใช้หรือการตั้งค่าและอาจเรียก$acommand eval
นั่นเป็นสิ่งที่มองข้ามเพราะksh(ซึ่งข้อมูลจำเพาะส่วนใหญ่อ้างอิงจาก) ไม่ได้ใช้มัน (และ AT&T kshและzshยังไม่ทำ) แต่ทุกวันนี้ยกเว้นทั้งสองเชลล์ส่วนใหญ่ใช้มัน พฤติกรรมแตกต่างกันระหว่างหอยในสิ่งที่ชอบ:
a=0; a=1 command eval a=2; echo "$a"
แม้ การใช้localบนเชลล์ที่สนับสนุนเป็นวิธีที่เชื่อถือได้มากขึ้นในการใช้ขอบเขตโลคัล
IFS=: command eval …กำหนดIFSเฉพาะในช่วงเวลาของevalตามที่ได้รับคำสั่งจาก POSIX ในประ, pdksh และทุบตี แต่ไม่ได้อยู่ใน ksh 93u มันผิดปกติที่จะเห็นว่า ksh นั้นเป็นสิ่งที่แปลกและไม่เข้ากันเลย