นิยามตัวแปรใน bash โดยใช้คีย์เวิร์ด local


33

ฉันเรียนรู้สคริปต์ทุบตีและพบสิ่งนี้ใน / usr / share / bash-completion ของฉันบรรทัด 305:

local cword words=()

มันทำอะไร? แบบฝึกหัดออนไลน์ทั้งหมดอยู่ในรูปแบบ

local var=value

คำตอบ:


92

แม้ว่าฉันจะชอบคำตอบที่ได้รับจากจอร์แดนฉันคิดว่ามันสำคัญพอ ๆ กันที่จะแสดงให้Linuxผู้ใช้ที่มีประสบการณ์น้อยลงรู้วิธีรับมือกับคำถามเหล่านี้ด้วยตนเอง

วิธีที่แนะนำนั้นเร็วกว่าและหลากหลายกว่าการหาคำตอบที่หน้าสุ่มปรากฏขึ้นที่หน้าผลการค้นหาของ Google

ประการแรกคำสั่งทั้งหมดที่สามารถทำงานในBashโดยไม่ต้องพิมพ์เส้นทางที่ชัดเจนให้กับมันเช่น./commandสามารถแบ่งออกเป็นสองประเภท: และBash shell builtins มาติดตั้งกับและเป็นส่วนหนึ่งของมันในขณะที่ไม่ได้เป็นส่วนหนึ่งของ สิ่งนี้มีความสำคัญเนื่องจากมีการบันทึกไว้ด้านในและสามารถเรียกใช้เอกสารด้วยคำสั่งในขณะที่มักจะทำเป็นเอกสารด้วยตนเองหรือใช้ธงราชา ในการตรวจสอบว่าคำสั่งเป็นหรือ:external commandsBash shell builtinsBashexternal commandsBashBash shell builtinsman bashhelpexternal commandsmanpages-h, --helpBash shell builtinexternal command

$ type local
local is a shell builtin

มันจะแสดงhow command would be interpreted if used as a command name(จากhelp type) ที่นี่เราจะเห็นได้ว่าเป็นlocal shell builtinลองดูตัวอย่างอื่น:

$ type vim
vim is /usr/bin/vim

ที่นี่เราจะเห็นได้ว่าvimไม่ได้เป็นแต่คำสั่งภายนอกอยู่ในshell builtin /usr/bin/vimอย่างไรก็ตามบางครั้งคำสั่งเดียวกันสามารถติดตั้งได้ทั้งในexternal commandและและshell builtinในเวลาเดียวกัน เพิ่ม-aในtypeรายการความเป็นไปได้ทั้งหมดเช่น:

$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
echo is /bin/echo

ที่นี่เราจะเห็นได้ว่าechoเป็นทั้งและshell builtin external commandอย่างไรก็ตามหากคุณเพียงแค่พิมพ์echoและกดReturna shell builtinก็จะถูกเรียกเพราะจะปรากฏขึ้นเป็นครั้งแรกในรายการนี้ โปรดทราบว่าเวอร์ชันเหล่านี้ทั้งหมดechoไม่จำเป็นต้องเหมือนกัน ตัวอย่างเช่นในระบบของฉัน/usr/bin/echoจะ--helpตั้งค่าสถานะในขณะที่builtinไม่

ตกลงตอนนี้เมื่อเรารู้ว่าlocalมันเป็นกระสุนในตัวเรามาดูกันว่ามันทำงานอย่างไร:

$ help local
local: local [option] name[=value] ...
Define local variables.

Create a local variable called NAME, and give it VALUE.  OPTION can
be any option accepted by `declare'.

Local variables can only be used within a function; they are visible
only to the function where they are defined and its children.

Exit Status:
Returns success unless an invalid option is supplied, an error occurs,
or the shell is not executing a function.

หมายเหตุบรรทัดแรก: name[=value]. ทุกอย่างระหว่าง[และ]เป็นตัวเลือก เป็นการประชุมทั่วไปที่ใช้ในหลาย ๆmanpagesรูปแบบของเอกสารใน*nixโลก ที่ถูกกล่าวว่าคำสั่งที่คุณถามในคำถามของคุณเป็นกฎหมายอย่างสมบูรณ์ ในทางกลับกัน...ตัวละครหมายความว่าอาร์กิวเมนต์ก่อนหน้านี้สามารถทำซ้ำได้ คุณสามารถอ่านเกี่ยวกับอนุสัญญานี้ได้ในman man:

The following conventions apply to the SYNOPSIS section and can be used
as a guide in other sections.

bold text          type exactly as shown.
italic text        replace with appropriate argument.
[-abc]             any or all arguments within [ ] are optional.
-a|-b              options delimited by | cannot be used together.
argument ...       argument is repeatable.
[expression] ...   entire expression within [ ] is repeatable.

ดังนั้นในตอนท้ายของวันฉันหวังว่าตอนนี้คุณจะมีเวลามากขึ้นในการทำความเข้าใจกับคำสั่งต่าง ๆ ในการLinuxทำงาน


5
คำตอบที่ดีมาก ฉันอ่านมันโดยหวังว่าคุณจะบอกว่าผู้เริ่มต้นสามารถค้นพบตัวเองได้อย่างไรว่าการมอบหมายอาเรย์นั้นเป็นอย่างไรจากรหัสvar=()แต่ฉันคิดว่ามันเป็นเรื่องเล็กน้อยที่จะเข้าใจโดยไม่รู้ชื่อของสิ่งที่คุณกำลังมองหา . ;)
ไวด์การ์ด

เชลล์ที่ไม่ใช่ bash รองรับlocalหรือไม่?
palswim

2
ผมเซ็นสัญญาในเวลาเพียงเพื่อที่ฉันสามารถ upvote คำตอบของคุณ :)
Harendra ซิงห์

@Wildcard เนื่องจากอาเรย์นั้นมีไวยากรณ์ของ bash ซึ่งตรงข้ามกับคำสั่งคุณสามารถค้นหามันman bashได้ เมื่ออยู่ในนั้นพิมพ์/Arrays$เพื่อข้ามไปยังส่วนในอาร์เรย์ (การตาม$หลังArraysคือเพื่อป้องกันการขี่จักรยานผ่านการอ้างอิงข้อความในส่วน) จากนั้นคุณสามารถพิมพ์fเพื่อไปข้างหน้าหน้าหรือbย้อนกลับ พิมพ์qเพื่อออกจากหน้าคนเมื่อเสร็จแล้ว
Taylor Edmiston

นอกจากนี้การรันhelpโดยไม่มี args จะแสดงรายการ bash builtins ทั้งหมดหากคุณอยากรู้เพิ่มเติม
Taylor Edmiston

29

localคำหลักสามารถใช้หลายตัวแปร การจัดเตรียมตัวแปรที่มีค่าเป็นทางเลือก ตัวอย่างของคุณประกาศสองตัวแปรและcword ตัวแปรที่ได้รับมอบหมายอาร์เรย์ที่ว่างเปล่าwordswords


18

localเพียงประกาศตัวแปรที่จะมีขอบเขตเฉพาะในฟังก์ชั่นที่กำหนดในปัจจุบันเพื่อให้สภาพแวดล้อมการดำเนินการหลักไม่สามารถ "เห็น" ค่า คุณไม่สามารถใช้localนอกฟังก์ชั่น ตัวอย่าง

func() {
   nonlocal="Non local variable"
   local onlyhere="Local variable"
}
func
echo $nonlocal 
echo $onlyhere

เอาท์พุท: ไม่ใช่ตัวแปรท้องถิ่น

ดังนั้นจึง$onlyhereไม่สามารถมองเห็นได้นอกขอบเขตของฟังก์ชัน


คำตอบนี้ทำให้เข้าใจได้ง่ายขึ้นว่าใครต้องการความเข้าใจอย่างรวดเร็ว
Alex Raj Kaliamoorthy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.