Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

The Magic ~:Bash Tilde Expansion với 5 ví dụ

The Magic ~:Bash Tilde Expansion với 5 ví dụ Bash shell cung cấp một số biến có tiền tố là '~' (được đặt tên là dấu ngã) được gọi là Mở rộng dấu ngã.

Chúng là từ đồng nghĩa với nội dung của các biến khác trong trình bao của bạn.

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

Mở rộng dấu ngã áp dụng cho các ký tự cộng '~' 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 dấu ngã được sử dụng để mở rộng đến một số tên đường dẫn cụ thể:

  • Thư mục chính
  • Thư mục làm việc hiện tại / trước đây
  • Các thư mục từ ngăn xếp thư mục.

Thư mục Trang chủ

Mở rộng Tilde cung cấp một cách để mở rộng thư mục chính của người dùng hiện tại hoặc thư mục chính của tên người dùng đã cho.

Syntax

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

~USER Expand to the home directory of the given username

Ví dụ 1. Trang chủ Người dùng Hiện tại

Dấu ngã (~) như một từ riêng biệt, mở rộng thành $ HOME nếu nó được xác định, nếu $ HOME không được xác định, thì nó sẽ mở rộng với thư mục chính của người dùng hiện tại.

Bây giờ giá trị của biến HOME là / home / oracle nên cd ~ đã thay đổi thư mục hiện tại thành giá trị của $ 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 được đổi thành / sbin, và cd ~ chỉ sử dụng $ HOME chứ không phải thư mục chính của người dùng. Sau khi bỏ đặt giá trị của $ HOME, cd ~ đã thay đổi thư mục thành giá trị của thư mục chính được đặt cho người dùng oracle trong / etc / passwd. Đối với mở rộng Tilde, HOME ghi đè thư mục chính thực.

[~]$ export HOME=/sbin

[oracle]$ cd ~

[~]$ pwd
/sbin

[~]$ unset HOME

[sbin]$ cd ~

[oracle]$ pwd
/home/oracle

Ví dụ 2. Thư mục chính của người dùng đã cho

Tập lệnh sau sẽ sao lưu tệp nhật ký có tên ngày hiện tại. Nó cũng ghi thời gian bắt đầu và thời gian kết thúc vào tệp có tên backup.log trong thư mục chính của người dùng 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 người dùng đã cho không tồn tại thì nó sẽ không mở rộng thành một cái gì đó. Trong ví dụ sau, không có người dùng nào được gọi là ora. Vì vậy, ~ ora sẽ không mở rộng thành / home / ora.

$ echo ~ora
~ora

Tham khảo bài viết trước của chúng tôi để hiểu cách thực hiện mở rộng dấu ngoặc nhọn trong bash. tức là cách sử dụng {} trong bash.

Thư mục làm việc

Dấu ngã với + và - được sử dụng để đại diện cho các thư mục đang hoạt động.

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

Ví dụ 3. Mở rộng các thư mục làm việc cũ / hiện tại

Ví dụ sau sẽ so sánh tệp 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 về Bash đang thực hiện.

Mở rộng cho các thư mục trong ngăn xếp

Mỗi quy trình bash chứa một đối tượng ngăn xếp có thể được sử dụng để theo dõi các thư mục mà một tập lệnh đã truy cập trong khi nó đang xử lý dữ liệu của nội dung thư mục.

Đây là một cơ chế rất đơn giản để có thể tham chiếu các thư mục hoặc thay đổi trở lại các thư mục mà người ta đã truy cập trước đó. Mở rộng Tilde cũng cung cấp khả năng mở rộng cho các 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ừ bên trái của danh sách được in bởi các dirs khi được gọi mà không có tùy chọn), bắt đầu bằng số không.
  • ~ -N Mở rộng thư mục thứ N trong ngăn xếp thư mục (đếm từ bên phải danh sách được in bởi các dirs khi được gọi mà không có tùy chọn), bắt đầu bằng số không.

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

Ví dụ 4. Hiển thị thư mục thứ N từ bên trái bằng ~ +

Trong ví dụ sau, ngăn xếp thư mục có 4 thư mục. ~ + 2 cung cấp cho bạn đường dẫn thư mục có sẵn ở vị trí thứ hai từ trái bắt đầu bằng số 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 trên cùng của ngăn xếp (vị trí số không) sẽ luôn có thư mục hiện tại. Vì vậy, sau khi thực hiện ở trên, phần sau được 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ừ bên phải bằng ~ -

Sau đây là tương tự như ví dụ trên. Tuy nhiên, sẽ xem xét các thư mục từ cuối 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