我想只有在一个特定的文件类型的存在是为了执行一项任务 - 所以我有这个BASH如果 - 如果没有提供
if [ -e `find /directory -type f -name "*.filetype" | head -1`];
then ...
这是一直在评估真(即使像这样没有文件类型存在 - 我最终意识到这一点:
if [ -e ]
评估为真(即如果没有给出 - 这发生在我的病情没有找到文件类型) - 有谁知道我应该怎样做才能得到我所需要的
?我想只有在一个特定的文件类型的存在是为了执行一项任务 - 所以我有这个BASH如果 - 如果没有提供
if [ -e `find /directory -type f -name "*.filetype" | head -1`];
then ...
这是一直在评估真(即使像这样没有文件类型存在 - 我最终意识到这一点:
if [ -e ]
评估为真(即如果没有给出 - 这发生在我的病情没有找到文件类型) - 有谁知道我应该怎样做才能得到我所需要的
?你的行会一直正确使用
if [ -n "`find /directory -type f -name '*.filetype'`" ] ;
-n
试验非空字符串。
如注释中所述,不赞成使用反引号语法而支持$()
语法。
我最近才知道这个技巧:
if [[ $(find /directory -type f -name "*.filetype" 2>/dev/null) ]]; then
...
fi
/dev/null
隐瞒任何错误消息find
输出将非空白,如果该文件符合这两个条件,否则将是空白的。[[ ... ]]
的计算结果为true或false。我使用不同版本之前:
if find /directory -type f -name "*.filetype" 2>/dev/null | grep -q .; then
...
fi
但是这是不太好的,因为它使用一个额外的grep
过程。第一种解决方案与单个find
流程相同。
'$(find ...)'评估的结果是错误的还是会产生错误?我测试了名为“1 == 2”和“&&”的文件,它运行正常,但我想知道是否没有任何风险。 – damienfrancois
@damienfrancois,在bash里'[[...]]',变量*不受*分词限制,所以这个构造只会检查输出的字符串长度。 –
@glennjackman好的谢谢澄清 – damienfrancois
什么版本的查找返回非零的有效查询没有结果? –
@glennjackman哼我混淆了我脑海中的东西。感谢您的反馈意见。 – damienfrancois
这不起作用的原因不是:'[-n]'返回true,因为当'['命令只能看到一个项目(“-n”)时,它会检查它是否是非空白,如果是则返回true。换句话说,它将“-n”视为要测试的字符串而不是操作员。解决方案是对命令替换部分进行双引号:'if [-n“$(find ... head -1)”];然后'注意我已经使用'$()'而不是反引号,因为语法有点干净,而''''之前的空格是必需的。 –