Bash 波浪号扩展的 5 个示例

举报
Tiamo_T 发表于 2022/02/18 16:12:31 2022/02/18
【摘要】 Bash shell 提供了一些以'~'(命名为波浪号)为前缀的变量,称为波浪号扩展。 它们是 shell 中其他变量内容的同义词。

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
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。