设计一个脚本,将文件名作为参数(必须存在于当前目录中)并从主目录树中找到其链接的所有路径名。该清单应邮寄给自己。我已经尝试过这个,但我不知道脚本到底想要什么..
#!/bin/bash
echo. "enter file name"
read name
if [ $name == "a1.txt" ]; then
source a1.txt
fi
/* a1.txt file contents tree -l */
答案1
好吧,让我们把它分解成几个部分:
- 将文件名作为参数
- 确保该文件存在(并且是常规文件)
- 查找下文件的所有(符号)链接
$HOME
- 将此文件列表邮寄至
$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
使用 或 之一bash
,ksh93
我们可以查看这些文件并将它们与用户使用我们提供的文件进行比较
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
,或者将整个字符串替换为您想要使用的任何电子邮件地址。