标签: test

测试是否有匹配模式的文件以执行脚本

我正在尝试编写一个if语句来测试是否有任何文件匹配某个模式。如果目录中有文本文件,它应该运行给定的脚本。

我目前的代码:

if [ -f /*.txt ]; then ./script fi
Run Code Online (Sandbox Code Playgroud)

请给出一些想法;如果.txt目录中有一个,我只想运行脚本。

shell shell-script wildcards files test

37
推荐指数
5
解决办法
10万
查看次数

比较整数:算术表达式或条件表达式

在 Bash 中,可以使用条件表达式比较两个整数

ARG1 OP ARG2

OP是一个-eq-ne-lt-le-gt,或-ge。如果arg1 分别等于、不等于、小于、小于或等于、大于或大于或等于arg2,则这些算术二元运算符返回 true 。Arg1arg2可以是正整数或负整数。

或算术表达式:

<= >= < > 比较

== != 平等与不平等

为什么我们有两种不同的方法来比较两个整数?什么时候用哪个?

例如,[[ 3 -lt 2 ]]使用条件表达式,并(( 3 < 2 ))使用算术表达式。当比较为真时两者都返回 0

比较两个整数时,这两种方法可以互换使用吗?如果是,为什么 Bash 有两种方法而不是一种方法?

shell bash history arithmetic test

37
推荐指数
3
解决办法
7万
查看次数

以 bash 开头:-lt 和 -gt 参数

我从 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)是做什么的?谢谢!

shell bash test

32
推荐指数
2
解决办法
26万
查看次数

如何一起使用 bash 的 if test 和 find 命令?

我有一个包含崩溃日志的目录,我想在基于 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)

有几个地方我不清楚:

  • 我查看了if 标志,但我不确定应该使用哪一个(如果有)。
  • 我是否需要该test指令,还是应该直接针对 find 命令的结果进行处理,或者可能用于find... | wc -l获取行数?
  • 不是 100% 有必要回答这个问题,而是test为了测试命令返回的返回码?而且它们有点不可见 - 在stdout/之外stderr?我阅读了该man页面,但我仍然不清楚何时使用test以及如何调试它。

scripting bash find shell-script test

30
推荐指数
2
解决办法
10万
查看次数

方括号可执行文件的目的是什么

我看到有一个名为“[”的可执行文件/usr/bin。它的目的是什么?

在此处输入图片说明

utilities test

30
推荐指数
3
解决办法
7698
查看次数

测试 shell 脚本中的变量是否为空

我已经看到在许多不同的 shell 上多次使用以下技术来测试变量是否为空:

if [ "x$1" = "x" ]; then 
    # Variable is empty
fi
Run Code Online (Sandbox Code Playgroud)

与更规范的相比,使用它有什么优势if [ -z "$1" ]吗?会不会是便携性问题?

shell shell-script portability test

29
推荐指数
2
解决办法
9万
查看次数

这两条 Bash 行在功能上是等效的。有人可以解释为什么一个更快吗?

$ 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测试相同的功能,以及为什么它更快。各有优缺点吗?

bash time test

28
推荐指数
1
解决办法
3395
查看次数

当字符串是左括号时,shell 括号测试出错

我曾经相信引用字符串总是一个很好的做法,以避免让 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)

我仍然需要知道这里发生了什么。

shell test

27
推荐指数
2
解决办法
1653
查看次数

unix 测试何时在测试命令中使用 eq vs = vs ==?

我什么时候应该使用-eqvs =vs==

例如

[[ $num -eq 0 ]]

[[ $num = 'zzz' ]]
Run Code Online (Sandbox Code Playgroud)

我观察到对数字和字符串使用-eq(和-ne等)的模式=。有没有原因,我应该什么时候使用==

shell test

26
推荐指数
1
解决办法
2万
查看次数

将变量作为字符串或整数进行比较时是否有任何重大区别

出于好奇,在进行 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()对比较也更加严格,即传递一个十进制值会破坏它,而不 …

shell bash test

24
推荐指数
2
解决办法
2万
查看次数