Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

The Magic ~:Bash Tilde Expansion พร้อมตัวอย่าง 5 ตัวอย่าง

The Magic ~:Bash Tilde Expansion พร้อมตัวอย่าง 5 ตัวอย่างBash shell มีตัวแปรบางตัวที่นำหน้าด้วย '~' (ชื่อ tilde) ซึ่งเรียกว่า Tilde Expansions

เป็นคำพ้องความหมายสำหรับเนื้อหาของตัวแปรอื่นๆ ภายในเชลล์ของคุณ

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

การขยายตัวหนอนใช้กับอักขระ '~' บวก รวมถึง +, – และ N (ซึ่งเป็นจำนวนเต็ม) จนถึงช่องว่างหรือเครื่องหมายทับ .

การขยายตัวหนอนใช้เพื่อขยายไปยังชื่อพาธเฉพาะหลายชื่อ:

  • โฮมไดเร็กตอรี่
  • ไดเรกทอรีการทำงานปัจจุบัน/ก่อนหน้า
  • ไดเร็กทอรีจากไดเร็กทอรีสแต็ก

โฮมไดเร็กทอรี

การขยาย Tilde ให้วิธีการขยายโฮมไดเร็กทอรีของผู้ใช้ปัจจุบันหรือโฮมไดเร็กทอรีของชื่อผู้ใช้ที่กำหนด

Syntax

~ Expand to the variable $HOME or home directory of the current user

~USER Expand to the home directory of the given username

ตัวอย่าง 1. หน้าแรกของผู้ใช้ปัจจุบัน

Tilde(~) เป็นคำที่แยกจากกัน ขยายเป็น $HOME หากมีการกำหนดไว้ หากไม่ได้กำหนด $HOME ก็จะขยายด้วยโฮมไดเร็กทอรีของผู้ใช้ปัจจุบัน

ตอนนี้ค่าของตัวแปร HOME คือ /home/oracle ดังนั้น cd ~ เปลี่ยนไดเร็กทอรีปัจจุบันเป็นค่าของ $HOME

## Logging into a oracle user, whose home directory is /home/oracle
# su oracle
[tmp]$ pwd
/tmp

[tmp]$ echo $HOME
/home/oracle

[tmp]$ cd ~

[~]$ pwd
/home/oracle

HOME ถูกเปลี่ยนเป็น /sbin และ cd ~ ใช้ $HOME เท่านั้น ไม่ใช่โฮมไดเร็กทอรีของผู้ใช้ หลังจากยกเลิกการตั้งค่า $HOME แล้ว cd ~ เปลี่ยนไดเร็กทอรีเป็นค่าของโฮมไดเร็กทอรีที่กำหนดไว้สำหรับผู้ใช้ oracle ใน /etc/passwd สำหรับการขยาย Tilde HOME จะแทนที่โฮมไดเร็กทอรีจริง

[~]$ export HOME=/sbin

[oracle]$ cd ~

[~]$ pwd
/sbin

[~]$ unset HOME

[sbin]$ cd ~

[oracle]$ pwd
/home/oracle

ตัวอย่างที่ 2 โฮมไดเร็กทอรีของผู้ใช้ที่กำหนด

สคริปต์ต่อไปนี้ใช้การสำรองข้อมูลของล็อกไฟล์ที่มีวันที่ปัจจุบันในชื่อ นอกจากนี้ยังบันทึกเวลาเริ่มต้นและเวลาสิ้นสุดลงในไฟล์ชื่อ backup.log ในโฮมไดเร็กทอรีของผู้ใช้ oracle

#! /bin/bash

echo "Initiating the backup at `date`" >> ~oracle/backup.log

da=`date +%F`
cp $da.log{,.bak}

echo "END BACKUP at `date`" >> ~oracle/backup.log

$ ls -l /home/oracle/
total 8
-rw-r--r-- 1 root root 99 Jun 4 14:23 backup.log

หากไม่มีชื่อผู้ใช้ที่ระบุ ชื่อผู้ใช้นั้นจะไม่ขยายไปยังบางสิ่ง ในตัวอย่างต่อไปนี้ ไม่มีผู้ใช้ชื่อ ora ดังนั้น ~ora จะไม่ขยายเป็น /home/ora

$ echo ~ora
~ora

อ้างถึงบทความก่อนหน้าของเราเพื่อทำความเข้าใจวิธีการขยายวงเล็บปีกกาในทุบตี เช่นวิธีการใช้ { } ในทุบตี

ไดเร็กทอรีการทำงาน

ตัวหนอนที่มี + และ – ใช้สำหรับแสดงไดเร็กทอรีการทำงาน

  • ~+ ขยายเป็นค่าของตัวแปร PWD ซึ่งเก็บไดเร็กทอรีการทำงานปัจจุบันไว้
  • ~- ขยายเป็นค่าของตัวแปร OLDPWD ซึ่งเก็บไดเร็กทอรีการทำงานก่อนหน้า หากไม่ได้ตั้งค่า OLDPWD ~- จะไม่ถูกขยาย

ตัวอย่างที่ 3 การขยายไดเรกทอรีการทำงานเก่า/ปัจจุบัน

ตัวอย่างต่อไปนี้จะเปรียบเทียบไฟล์ในไดเร็กทอรีปัจจุบันและไดเร็กทอรีการทำงานก่อนหน้า

$ cat comp.sh
#! /bin/bash

set -x
cd /var/opt/gg
if [ -f gg.c ]
then
echo "File1 exists"
fi

cd /var/opt1/gg
if [ -f gg.c ]
then
echo "File2 exists"
cmp ~+/gg.c ~-/gg.c
fi

$ ./comp.sh
+ cd /var/opt/gg
+ '[' -f gg.c ']'
+ echo 'File1 exists'
File1 exists
+ cd /var/opt1/gg
+ '[' -f gg.c ']'
+ echo 'File2 exists'
File2 exists
+ cmp /var/opt1/gg/gg.c /var/opt/gg/gg.c
cmp: EOF on /var/opt1/gg/gg.c
$

ในการดำเนินการข้างต้น:

  • ~+/gg.c ขยายเป็น /var/opt1/gg/gg.c
  • ~-/gg.c ขยายเป็น /var/opt/gg/gg.c

บทความนี้เป็นส่วนหนึ่งของชุดการสอน Bash ที่กำลังดำเนินอยู่

ส่วนขยายสำหรับไดเรกทอรีในสแต็ก

แต่ละกระบวนการทุบตีมีวัตถุสแต็กที่สามารถใช้เพื่อติดตามไดเรกทอรีที่สคริปต์เข้าชมในขณะที่กำลังประมวลผลข้อมูลของเนื้อหาไดเรกทอรี

เป็นกลไกที่ง่ายมากในการอ้างอิงไดเร็กทอรีหรือเปลี่ยนกลับไปเป็นไดเร็กทอรีที่เคยเยี่ยมชมมาก่อน การขยาย Tilde ยังให้การขยายไปยังไดเร็กทอรีในไดเร็กทอรีสแต็กอีกด้วย

  • ~+N ขยายไดเร็กทอรี Nth ในไดเร็กทอรีสแต็ก (นับจากด้านซ้ายของรายการที่พิมพ์โดย dirs เมื่อเรียกใช้โดยไม่มีตัวเลือก) โดยเริ่มจากศูนย์
  • ~-N ขยายไดเร็กทอรี Nth ในไดเร็กทอรีสแต็ก (นับจากด้านขวาของรายการที่พิมพ์โดย dirs เมื่อเรียกใช้โดยไม่มีตัวเลือก) โดยเริ่มจากศูนย์

อ่านบทความก่อนหน้าของเราเพื่อทำความเข้าใจวิธีใช้คำสั่ง dirs, pushd และ popd เพื่อจัดการกับไดเร็กทอรีสแต็ก

ตัวอย่างที่ 4 แสดงไดเร็กทอรี Nth จากด้านซ้ายโดยใช้ ~+

ในตัวอย่างต่อไปนี้ ไดเร็กทอรีสแต็กมี 4 ไดเร็กทอรี ~+2 ช่วยให้คุณมีเส้นทางไดเรกทอรีในตำแหน่งที่สองจากด้านซ้ายโดยเริ่มจากศูนย์

$ dirs -v
 0 /sbin
 1 /var/opt/midas
 2 /var/opt/GG/bin
 3 /root

$ cd ~+2

$ pwd
/var/opt/GG/bin

แต่ด้านบนของสแต็ก (ตำแหน่งศูนย์) จะมีไดเร็กทอรีปัจจุบันเสมอ ดังนั้นหลังจากดำเนินการข้างต้น การติดตามจะปรากฏในไดเร็กทอรีสแต็ก

$ dirs -v
 0 /var/opt/GG/bin
 1 /var/opt/midas
 2 /var/opt/GG/bin
 3 /root

ตัวอย่างที่ 5. แสดงไดเร็กทอรี Nth จากด้านขวาโดยใช้ ~-

ต่อไปนี้เป็นคล้ายกับตัวอย่างข้างต้น แต่จะพิจารณาไดเร็กทอรีจากด้านล่างสุดของสแต็กเนื่องจาก ~-.

$ dirs -v
 0 /var/opt/GG/bin
 1 /var/opt/midas
 2 /var/opt/GG/bin
 3 /root

$ cd ~-2

$ pwd
/var/opt/midas

$ dirs -v
 0 /var/opt/midas
 1 /var/opt/midas
 2 /var/opt/GG/bin
 3 /root