Bash 波浪号扩展的 5 个示例
Bash shell 提供了一些以'~'(命名为波浪号)为前缀的变量,称为波浪号扩展。
它们是 shell 中其他变量内容的同义词。
波浪号扩展是将这些缩写转换为它们所代表的目录名称的过程。在本文中,让我们通过示例了解一下波浪号扩展功能。
波浪号扩展适用于 '~' 加号字符,包括 +、- 和 N(整数)直到空格或斜杠。
波浪号扩展用于扩展为几个特定的路径名:
- 主目录
- 当前/上一个工作目录
- 目录堆栈中的目录。
主目录
波浪号扩展提供了一种扩展当前用户的主目录或给定用户名的主目录的方法。
Syntax
~ Expand to the variable $HOME or home directory of the current user
~USER Expand to the home directory of the given username
示例 1. 当前用户主页
波浪号(~)作为一个单独的词,如果已定义则扩展为 $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 ~ 将目录更改为 /etc/passwd 中为 oracle 用户设置的主目录的值。对于波浪号扩展,HOME 会覆盖真实的主目录。
[~]$ export HOME=/sbin
[oracle]$ cd ~
[~]$ pwd
/sbin
[~]$ unset HOME
[sbin]$ cd ~
[oracle]$ pwd
/home/oracle
示例 2. 给定用户的主目录
以下脚本会备份名称中包含当前日期的日志文件。它还将开始时间和结束时间记录到 oracle 用户主目录中名为 backup.log 的文件中。
#! /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
请参阅我们之前的文章以了解如何在 bash 中执行大括号扩展。即如何在 bash 中使用 { }。
工作目录
带有 + 和 - 的波浪号用于表示工作目录。
- ~+ 扩展为保存当前工作目录的 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 教程系列的一部分。
堆栈中目录的扩展
每个 bash 进程都包含一个堆栈对象,可用于跟踪脚本在处理目录内容数据时访问的目录。
这是一种非常简单的机制,可以引用目录或更改回之前访问过的目录。波浪号扩展还提供对目录堆栈中目录的扩展。
- ~+N 展开目录堆栈中的第 N 个目录(从 dirs 不带选项调用时打印的列表的左侧开始计数),从零开始。
- ~-N 展开目录堆栈中的第 N 个目录(从 dirs 不带选项调用时打印的列表的右侧开始计数),从零开始。
查看我们之前的文章,了解如何使用dirs、pushd 和 popd 命令来操作目录堆栈。
示例 4. 使用 ~+ 显示左起第 N 个目录
在以下示例中,目录堆栈有 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. 使用 ~- 显示右起第 N 个目录
以下与上面的示例类似。但是,将考虑堆栈底部的目录,因为 ~-.
$ 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
- 点赞
- 收藏
- 关注作者
评论(0)