我需要使用 if 语句来响应空白输出。我有:
while read -p "Enter filename: "
do Extant=$(ls | grep $name)
echo "$Extant"
来存储和显示结果。没关系...直到文件名不存在。我希望它:
测试 $Extant 是否为空(表明该文件不存在),
然后回应类似“它不在这里”之类的话
然后回到 while 循环
要不然
只需返回到 while 循环(因为它将输出匹配的文件(如果存在))。
我最初想,我可以用类似的东西来做到这一点:
if $Extant=""
then echo "it's not here"
return
else
return
fi
但结果并不像我所希望的那样。它不断尝试运行它找到的内容,就像命令一样
不确定这里发生了什么,但我感谢任何帮助
答案1
你不想在这里使用ls
也不grep
。 ls
主要是为了视觉的检查目录内容,grep
主要用于从较大文本中返回文本行。
IFS= read -r -p 'Filename please: ' name
while [[ ! -e $name ]]; do
printf '%s does not exist\n' "$name"
read -p 'Try again: ' name
done
printf '%s exists\n' "$name"
如果文件系统中存在给定名称,则测试-e
为真。这里我们否定了循环中测试的意义。
为了避免两次单独调用read
:
while true; do
IFS= read -r -p 'Filename please: ' name
[[ -e $name ]] && break
printf '%s does not exist\n' "$name"
done
printf '%s exists\n' "$name"
break
只要$name
文件系统中存在给定的值,就会退出此循环。
请注意,这些变体都无法读取包含换行符的文件名(换行符在 Unix 系统上的文件名中有效)。
对于用户来说,将任何文件名作为脚本的命令行参数通常会更方便,这意味着他们可以使用 shell 的文件名完成功能或文件名通配模式来提供文件名:
#!/bin/bash
name=$1
if [[ ! -e "$name" ]]; then
printf '%s does not exist\n' "$name"
exit 1
fi
printf '%s exists\n' "$name"
上面的脚本期望以单个文件名作为唯一参数来运行。将打印一条与给定名称的存在相关的消息。如果给定名称不存在,脚本将在if
语句内终止,用户必须重试。
这种变化会能够获取包含换行符的文件名,因为我们不会将名称作为带有read
.
有关的: