标签: scripting

检查脚本是否由 cron 启动,而不是手动调用

cron 在运行程序时是否设置了任何变量?如果脚本是由cron运行的,我想跳过一些部分;否则调用这些部分。

我如何知道 Bash 脚本是否由 cron 启动?

shell scripting bash cron

32
推荐指数
4
解决办法
3万
查看次数

在shebang中使用`/usr/bin/env sed -f`的方法?

输入/usr/bin/env sed -f终端工作。

但如果将其用作shebang,

#!/usr/bin/env sed -f 
s/a/b/
Run Code Online (Sandbox Code Playgroud)

脚本将无法执行:

/usr/bin/env: sed -f: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我有点相信它与-f有关。但是如何解决这个问题呢?

scripting sed executable env

31
推荐指数
4
解决办法
1万
查看次数

编写 bash 脚本时与 && 等价的是什么?

如果这是一个重复的问题,我提前道歉。在问这里之前,我确实努力搜索/检查。

我很乐意写这样的单行代码:

foocommand && foocommand2 && foocommand3
Run Code Online (Sandbox Code Playgroud)

这个想法是,如果前一个命令“成功”,我只希望后续命令运行。

我正在编写一个有点冗长的脚本,这个单行代码是不可行的,因为它看起来像是一大块令人困惑的代码。

我想在脚本中将命令隔开并在它们之间写注释。我怎样才能做到这一点,并且在那里仍然有相当于 && 的东西?

scripting bash centos

31
推荐指数
5
解决办法
2883
查看次数

使用 `set -eu` 时 EXIT 和 ERR 陷阱的正确行为

在使用set -e( errexit), set -u( nounset) 以及 ERR 和 EXIT 陷阱时,我观察到一些奇怪的行为。它们似乎相关,因此将它们放在一个问题中似乎是合理的。

1)set -u不触发 ERR 陷阱

  • 代码:

    #!/bin/bash
    trap 'echo "ERR (rc: $?)"' ERR
    set -u
    echo ${UNSET_VAR}
    
    Run Code Online (Sandbox Code Playgroud)
  • 预期:ERR 陷阱被调用,RC != 0
  • 实际:没有调用ERR 陷阱,RC == 1
  • 注意:set -e不会改变结果

2)set -eu在 EXIT 陷阱中使用退出代码是 0 而不是 1

  • 代码:

    #!/bin/bash
    trap 'echo "EXIT (rc: $?)"' EXIT
    set -eu
    echo ${UNSET_VAR}
    
    Run Code Online (Sandbox Code Playgroud)
  • 预期:退出陷阱被调用,RC == 1
  • 实际:调用退出陷阱,RC == 0
  • 注意:当使用 时set …

scripting bash parameter shell-script trap

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

将命令的输出存储在 shell 变量中

我有一个操作cut,我想将结果分配给一个变量

var4=echo ztemp.xml |cut -f1 -d '.'
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ztemp.xml 不是命令

var4never的值被赋值;我正在尝试为其分配以下输出:

echo ztemp.xml | cut -f1 -d '.'
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

command-line scripting bash shell-script coreutils

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

如何将变量发送到内联 shell 脚本?

我运行以下脚本:

VAR="Test"
sh -c 'echo "Hello $VAR"'
Run Code Online (Sandbox Code Playgroud)

但我得到:

# ./test.sh
Hello
Run Code Online (Sandbox Code Playgroud)

如何将VAR我的脚本变量发送到使用sh -c '...'.

shell scripting shell-script variable

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

如何一起使用 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万
查看次数

如何从任何 URL 获得响应?

我被要求编写一个 shell 脚本来检查我的项目的 URL 是否已启动/工作。

我试图在互联网上找到一些提示,但我得到的都是关于检查 URL 是否存在。

我第一次尝试使用wget.

wget -S --spider https://genesis-dev.webbank.ssmb.com:21589/gop-ui/app.jsp 2>&1 | awk '/^  /'
if [ $? -ne 0 ]
then echo "Server is UP"
else
echo "Server is down"
fi
Run Code Online (Sandbox Code Playgroud)

我的下一次尝试是使用curl.

curl -ivs  https://genesis-dev.webbank.ssmb.com:21589/opconsole-sit/opconsole.html#
if [ $? -ne 0 ]
then echo "Server is UP"
else
echo "Server is down"
fi
Run Code Online (Sandbox Code Playgroud)

但是,两者都在检查 URL 的存在而不是响应。

shell scripting ksh shell-script

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

找到第 1 列的最大值并从文件中打印第 2 列的相应记录

如何从第 1 列中找到最大值并从包含 n 条记录的文件中回显相应的路径位置。

$ cat version.log
112030  /opt/oracle/app/oracle/product/11.2.0
121010  /opt/oracle/app/oracle/product/12.1.0
Run Code Online (Sandbox Code Playgroud)

预期输出:

/opt/oracle/app/oracle/product/12.1.0
Run Code Online (Sandbox Code Playgroud)

shell scripting shell-script

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

在屏幕中运行脚本

我想在分离的屏幕中运行 bash 脚本。该脚本多次调用程序,每次都需要等待太长时间。我的第一个想法是简单地打开一个屏幕,然后调用脚本,但似乎ctrl-a d在脚本运行时我无法分离 (by )。所以我做了一些研究,发现这个指令用以下内容替换了shebang:

#!/usr/bin/screen -d -m -S screenName /bin/bash
Run Code Online (Sandbox Code Playgroud)

但这也不起作用(无法识别选项)。有什么建议?

PS 我刚刚想到screen -dmS name ./script.sh这可能对我的目的有用,但我仍然很好奇如何将它合并到脚本中。谢谢你。

scripting gnu-screen shell-script shebang

29
推荐指数
3
解决办法
12万
查看次数