我使用以下代码来列出 macOS 中目录的内容:
#!/bin/bash
echo "hello User"
echo ""
userdir=$1
var_one=$userdir\/Library\/Application\ Support\/iCloud\/Accounts\/
if [ -d "$var_one" ]
then
# echo "Direcotry exists"
echo "The AppleID is : "
sed -n '/[*\w-]+@([\w-]+\.)+[\w-]+/p'|ls "$var_one"|awk NR==2'{print}'
echo "~~~~~~~BYE~~~~~~"
break
else
echo "Directory doesn't exists"
echo "The path is $var_one"
fi
如果目录存在,则使用 sed 命令与正则表达式模式来识别所需的文件。该脚本工作正常,但似乎没有退出。
答案1
您的脚本中有一些可以改进的地方。
首先,它sed
不执行任何操作,因为它没有接收任何输入。这意味着它会坐在那里等待您将键盘上的内容输入到其标准输入流中。此外,请勿在文件名上使用sed
或其他文本编辑工具(awk
等)。 Unix 系统上的文件名可以包含换行符,并且sed
(例如)读取单独的行,这意味着它会将嵌入换行符的文件名作为两个单独的事物读取。
文件名包含换行符的情况并不常见,但如果脚本不考虑这一点,恶意用户就会可能可能利用这个事实来混淆脚本去做它不打算做的事情。
要查找当前登录的 Apple ID,不要使用一些启发式方法,而是使用可以为您完成此操作的工具。使用 Homebrew,您可以安装mas
:
brew install mas
然后,
mas account
将为您提供当前登录的 Apple ID。
答案2
尝试更换:
sed -n '/[*\w-]+@([\w-]+\.)+[\w-]+/p'|ls "$var_one"|awk NR==2'{print}'
像这样的事情:
ls "$var_one" | sed -n '2{/[*\w-]+@([\w-]+\.)+[\w-]+/p}'
也可以看看: 为什么不是解析ls
(以及做什么来代替)?