关于shell脚本的问题。无法得到这个问题

关于shell脚本的问题。无法得到这个问题

设计一个脚本,将文件名作为参数(必须存在于当前目录中)并从主目录树中找到其链接的所有路径名。该清单应邮寄给自己。我已经尝试过这个,但我不知道脚本到底想要什么..

#!/bin/bash
echo. "enter file name"
read name
if [ $name == "a1.txt" ]; then
source a1.txt
fi 
/* a1.txt file contents tree -l */

答案1

好吧,让我们把它分解成几个部分:

  1. 将文件名作为参数
  2. 确保该文件存在(并且是常规文件)
  3. 查找下文件的所有(符号)链接$HOME
  4. 将此文件列表邮寄至$LOGUSER

脚本可以采用一个(或多个)参数。命令行参数可在位置参数 $1等。由于我们只会得到一个参数,因此$2我们只关心 中的内容$1

name="$1"

为了测试一个名字是否存在,我们可以使用

if [ -e "$name" ]; then ... fi

在这种情况下,我们有兴趣测试一个名称是否不是存在:

if [ ! -e "$name" ]; then
   echo 'Name does not exist in directory' >&2
   exit 1
fi

由于我们要输出一个诊断信息(在本例中是一条错误消息),我们这样做是为了标准错误流echo通过重定向with的输出>&2。我们还以非零退出状态终止脚本,以表明出现了问题。

如果我们想确保该文件不仅存在,而且是一个常规文件,即不是目录或设备节点或其他东西,更改-e-f(阅读test手册)。

要查找主目录中的所有符号链接,我们可以使用

find "$HOME" -type l

使用 或 之一bashksh93我们可以查看这些文件并将它们与用户使用我们提供的文件进行比较

if [[ "$name" -ef "$link" ]]; then ... fi

其中$name$1$link从 返回的符号链接的名称find-ef如果两个操作数引用同一个文件(解析所有符号链接后),该运算符将返回真值。

可以将其find与上述测试结合起来,如下所示:

find "$HOME" -type l |
while read -r link; do
    if [[ "$name" -ef "$link" ]]; then
        printf '%s\n' "$link"
    fi
done

要发送电子邮件,请使用该mail命令。这可以被标记到上一个管道的末尾:

find "$HOME" -type l |
while read -r link; do
    if [[ "$name" -ef "$link" ]]; then
        printf '%s\n' "$link"
    fi
done |
mail -s "These are the links" "$LOGUSER@localhost"

$LOGUSER将保留您的用户名。"$(id -un)"如果由于某种原因未正确设置,请使用$LOGUSER,或者将整个字符串替换为您想要使用的任何电子邮件地址。

相关内容