Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Thành Thạo Mở Rộng Tilde Bash: 5 Ví Dụ Thực Tế

Thành Thạo Mở Rộng Tilde Bash: 5 Ví Dụ Thực TếShell Bash cung cấp một số biến có tiền tố '~' (gọi là tilde) gọi là Mở Rộng Tilde (Tilde Expansions).

Chúng là đồng nghĩa cho nội dung của các biến khác trong shell của bạn.

Mở rộng tilde là quá trình chuyển đổi các viết tắt này thành tên thư mục mà chúng đại diện. Trong bài này, chúng ta sẽ xem lại tính năng mở rộng tilde với các ví dụ.

Mở rộng tilde áp dụng cho '~' cộng ký tự bao gồm +, - và N (là số nguyên) cho đến khoảng trắng hoặc dấu gạch chéo.

Mở rộng tilde được dùng để mở rộng thành một số tên đường dẫn cụ thể:

  • Thư mục home
  • Thư mục làm việc hiện tại/truộc
  • Thư mục từ ngăn xếp thư mục.

Thư Mục Home

Mở rộng tilde cung cấp cách mở rộng thư mục home của user hiện tại hoặc thư mục home của tên user cho trước.

Syntax
~         Mở rộng thành biến $HOME hoặc thư mục home của user hiện tại
~USER     Mở rộng thành thư mục home của username cho trước

Ví Dụ 1. Home Của User Hiện Tại

Tilde(~) như một từ riêng biệt, mở rộng thành $HOME nếu được định nghĩa, nếu $HOME không được định nghĩa, thì nó mở rộng với thư mục home của user hiện tại.

Bây giờ giá trị biến HOME là /home/oracle nên cd ~ đổi thư mục hiện tại thành giá trị $HOME.

## Đăng nhập user oracle, thư mục home là /home/oracle
# su oracle
[tmp]$ pwd
/tmp
[tmp]$ echo $HOME
/home/oracle
[tmp]$ cd ~
[~]$ pwd
/home/oracle

HOME đổi thành /sbin, và cd ~ chỉ dùng $HOME không phải thư mục home của user. Sau khi unset giá trị $HOME, cd ~ đổi thư mục thành giá trị thư mục home đặt cho user oracle trong /etc/passwd. Với mở rộng tilde, HOME ghi đè thư mục home thực.

[~]$ export HOME=/sbin
[oracle]$ cd ~
[~]$ pwd
/sbin
[~]$ unset HOME
[sbin]$ cd ~
[oracle]$ pwd
/home/oracle

Ví Dụ 2. Thư Mục Home Của User Cho Trước

Script sau lấy bản sao lưu file log có ngày hiện tại trong tên. Nó cũng ghi thời gian bắt đầu và kết thúc vào file gọi là backup.log trong thư mục home của user 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

Nếu tên user cho trước không tồn tại thì nó không mở rộng thành cái gì. Trong ví dụ sau, không có user tên ora. Vì vậy, ~ora sẽ không mở rộng thành /home/ora.

$ echo ~ora
~ora

Tham khảo bài trước để hiểu cách thực hiện mở rộng ngoặc nhọn trong bash. tức là cách dùng { } trong bash.

Thư Mục Làm Việc

Tilde với + và - dùng để biểu thị thư mục làm việc.

  • ~+ mở rộng thành giá trị biến PWD chứa thư mục làm việc hiện tại.
  • ~- mở rộng thành giá trị biến OLDPWD, chứa thư mục làm việc trước. Nếu OLDPWD unset, ~- không mở rộng.

Ví Dụ 3. Mở Rộng Thư Mục Làm Việc Cũ/Hiện Tại

Ví dụ sau sẽ so sánh file trong thư mục hiện tại và thư mục làm việc trước.

$ 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
$

Trong thực thi trên:

  • ~+/gg.c mở rộng thành /var/opt1/gg/gg.c
  • ~-/gg.c mở rộng thành /var/opt/gg/gg.c

Bài viết này là một phần của loạt bài hướng dẫn Bash đang diễn ra.

Mở Rộng Cho Thư Mục Trong Ngăn Xếp

Mỗi tiến trình bash chứa một đối tượng ngăn xếp (stack) có thể dùng để theo dõi thư mục script đã truy cập khi xử lý dữ liệu nội dung thư mục.

Đây là cơ chế rất đơn giản để có thể tham chiếu thư mục hoặc quay lại thư mục đã truy cập trước. Mở rộng tilde cũng cung cấp mở rộng cho thư mục trong ngăn xếp thư mục.

  • ~+N Mở rộng thư mục thứ N trong ngăn xếp thư mục (đếm từ trái danh sách in bởi dirs khi gọi không tùy chọn), bắt đầu từ 0.
  • ~-N Mở rộng thư mục thứ N trong ngăn xếp thư mục (đếm từ phải danh sách in bởi dirs khi gọi không tùy chọn), bắt đầu từ 0.

Xem lại bài trước để hiểu cách dùng lệnh dirs, pushd và popd thao tác ngăn xếp thư mục.

Ví Dụ 4. Hiển Thị Thư Mục Thứ N Từ Trái Dùng ~+

Trong ví dụ sau, ngăn xếp thư mục có 4 thư mục. ~+2 cho bạn đường dẫn thư mục ở vị trí thứ 2 từ trái bắt đầu từ 0.

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

Nhưng đỉnh ngăn xếp (vị trí 0) luôn có thư mục hiện tại. Vì vậy sau thực thi trên, sau đây hiển thị trong ngăn xếp thư mục.

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

Ví Dụ 5. Hiển Thị Thư Mục Thứ N Từ Phải Dùng ~-

Sau đây tương tự ví dụ trên. Nhưng, sẽ xem xét thư mục từ đáy ngăn xếp vì ~-.

$ 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