我正在尝试编写一个if语句来测试是否有任何文件匹配某个模式。如果目录中有文本文件,它应该运行给定的脚本。
我目前的代码:
if [ -f /*.txt ]; then ./script fi
Run Code Online (Sandbox Code Playgroud)
请给出一些想法;如果.txt目录中有一个,我只想运行脚本。
在 Bash 中,可以使用条件表达式比较两个整数
ARG1 OP ARG2
OP是一个
-eq,-ne,-lt,-le,-gt,或-ge。如果arg1 分别等于、不等于、小于、小于或等于、大于或大于或等于arg2,则这些算术二元运算符返回 true 。Arg1和arg2可以是正整数或负整数。
或算术表达式:
<= >= < >比较
== !=平等与不平等
为什么我们有两种不同的方法来比较两个整数?什么时候用哪个?
例如,[[ 3 -lt 2 ]]使用条件表达式,并(( 3 < 2 ))使用算术表达式。当比较为真时两者都返回 0
比较两个整数时,这两种方法可以互换使用吗?如果是,为什么 Bash 有两种方法而不是一种方法?
我从 bash 开始,发现以下内容:
if test $first -lt $second
then
echo $first is lower than $second
else
if test $first -gt $second
then
echo $first is higher than $second
else
echo $first and $second are equals
fi
fi
Run Code Online (Sandbox Code Playgroud)
为了阅读脚本并执行它,我知道它的作用,但不知道 -lt 和 -gt 的用途。
有人可以告诉我这种“工具”的名称是什么以及它们(-lt 和 -gt)是做什么的?谢谢!
我有一个包含崩溃日志的目录,我想在基于 find 命令的 bash 脚本中使用条件语句。
日志文件以这种格式存储:
/var/log/crashes/app-2012-08-28.log
/var/log/crashes/otherapp-2012-08-28.log
Run Code Online (Sandbox Code Playgroud)
我希望 if 语句仅在特定应用程序的崩溃日志在过去 5 分钟内被修改时才返回 true。find我会使用的命令是:
find /var/log/crashes -name app-\*\.log -mmin -5
Run Code Online (Sandbox Code Playgroud)
我不确定如何将其if正确地合并到声明中。我认为这可能有效:
if [ test `find /var/log/crashes -name app-\*\.log -mmin -5` ] then
service myapp restart
fi
Run Code Online (Sandbox Code Playgroud)
有几个地方我不清楚:
test指令,还是应该直接针对 find 命令的结果进行处理,或者可能用于find... | wc -l获取行数?test为了测试命令返回的返回码?而且它们有点不可见 - 在stdout/之外stderr?我阅读了该man页面,但我仍然不清楚何时使用test以及如何调试它。我已经看到在许多不同的 shell 上多次使用以下技术来测试变量是否为空:
if [ "x$1" = "x" ]; then
# Variable is empty
fi
Run Code Online (Sandbox Code Playgroud)
与更规范的相比,使用它有什么优势if [ -z "$1" ]吗?会不会是便携性问题?
$ time if [[ $dir2 -ot $dir1 ]] ; then open $dir2 ; else open $dir1 ; fi
real 0m0.055s
user 0m0.023s
sys 0m0.018s
$ time [[ $dir2 -ot $dir1 ]] && open $dir2 || open $dir1
real 0m0.000s
user 0m0.000s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
在上面,我比较了两种测试哪个目录较旧,然后打开较旧目录的方法。我想我只是很困惑为什么测试后的&&and||运算符具有与if/then测试相同的功能,以及为什么它更快。各有优缺点吗?
我曾经相信引用字符串总是一个很好的做法,以避免让 shell 解析它。
然后我遇到了这个:
$ x='('
$ [ "$x" = '1' -a "$y" = '1' ]
bash: [: `)' expected, found 1
Run Code Online (Sandbox Code Playgroud)
试图隔离问题,得到同样的错误:
$ [ '(' = '1' -a '1' = '1' ]
bash: [: `)' expected, found 1
Run Code Online (Sandbox Code Playgroud)
我解决了这样的问题:
[ "$x" = '1' ] && [ "$y" = '1' ]
Run Code Online (Sandbox Code Playgroud)
我仍然需要知道这里发生了什么。
我什么时候应该使用-eqvs =vs==
例如
[[ $num -eq 0 ]]
[[ $num = 'zzz' ]]
Run Code Online (Sandbox Code Playgroud)
我观察到对数字和字符串使用-eq(和-ne等)的模式=。有没有原因,我应该什么时候使用==
出于好奇,在进行 bash 变量比较(其值为 an integer)时,可以针对某些声明为 anint或 as 的预定义值对其进行测试string。
示例脚本:
#!/bin/bash
f1()
{
[ "$1" == "1" ] && echo "$FUNCNAME: \"1\" compared as string"
}
f2()
{
[[ "$1" -eq 1 ]] && echo "$FUNCNAME: \"1\" compared as int"
}
f1 $1
f2 $1
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./param.sh 1
f1: "1" compared as string
f2: "1" compared as int
Run Code Online (Sandbox Code Playgroud)
和
$ ./param.sh blah
$
Run Code Online (Sandbox Code Playgroud)
这两个函数的行为方式相同,所以我想知道检查整数变量时是否有首选方法?我会去检查intvsint因为它更严格,但我想知道这样做是否有任何缺点string?
在这种情况下,f2()对比较也更加严格,即传递一个十进制值会破坏它,而不 …
test ×10
shell ×7
bash ×5
shell-script ×3
arithmetic ×1
files ×1
find ×1
history ×1
portability ×1
scripting ×1
time ×1
utilities ×1
wildcards ×1