标签: control-flow

在 bash 中显示和更新计数器

我认为它是这样的:(Fedora14/bash)

#!/bin/bash

for i in {0..10..1}; do echo -e "$i"'\c'
echo -e "\n\r"
sleep 1
done
Run Code Online (Sandbox Code Playgroud)

但它不起作用。目的:像这样,但没有“明确”:

#!/bin/bash

for i in {0..10..1}; do echo -e "$i"
sleep 1
clear
done
Run Code Online (Sandbox Code Playgroud)

因此,一个计数脚本不会删除整个屏幕以输出 +1 个数字,而是只删除计数所在的行,因此可能会出现例如:一个漂亮的“进度条”..

shell bash terminal control-flow

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

如何执行 Bash 命令并在失败时执行两条语句?

当且仅当测试返回错误时,我想执行 Bash 命令,然后执行两个操作。我更愿意在 Bash 中以单行方式解决此任务。

这是我尝试过的两种形式:

ssh user@1.2.3.4 "ls /home/somefile" || echo "File does not exist" && exit 1
ssh user@1.2.3.4 "ls /home/somefile" || echo "File does not exist"; exit 1
Run Code Online (Sandbox Code Playgroud)

含义如下:我想测试远程机器上文件的存在(或其他任何东西,只是一个例子),在第一个命令返回错误的情况下,然后 - 只有这样 - 以下两个命令(echo/ exit) 应该被执行。上面的示例exit 1独立于ssh命令的返回值执行语句。

如何重写这一行,以便仅在第一个 ( ) 命令失败时才执行echoexit命令ssh

shell bash control-flow

7
推荐指数
1
解决办法
3202
查看次数

如何知道驱动模块的代码流程?

我正在研究 Linux 设备驱动程序,我的主要重点是 wifi 驱动程序。我想知道当我插入我的设备时代码是如何流动的。也许,我可以做一些事情,比如printk在每个函数中添加一行。我拥有的设备由ath9k_htc驱动程序支持。出于学习目的,我想对驱动程序代码进行一些更改。

理解 linux 中驱动程序模块的代码流的正确或通用方法是什么?

drivers debugging kernel-modules control-flow

7
推荐指数
1
解决办法
763
查看次数

循环 curl 获取请求 bash

我正在尝试自动化 curl 脚本并最终使其也循环。我发现我不能使用任何循环,例如:

for i in `cat authors`
do
    curl *line here*   "www.test.com/autors?string="$i"&proc=39"
etc
Run Code Online (Sandbox Code Playgroud)

甚至是 CURL 的 env glob 变量

有没有办法在 curl 上为一个变量循环获取请求?

curl -H "Host: www.test.com" -G "www.test.com/autors?string="author+name"&proc=39"
Run Code Online (Sandbox Code Playgroud)

我得到的只是 CURL 的流量图,没有好的结果。我正在使用 bash

bash curl control-flow

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

bash - if 语句中的括号有什么作用?

也许这不仅仅适用于 bash,但我对括号在 if 语句中的作用感到困惑。大多数示例似乎具有以下格式

if [ expression ]; then
    #do stuff
fi
Run Code Online (Sandbox Code Playgroud)

但这并不总是对我有用。例如,我有以下脚本test.sh

#!/bin/bash

flag=False
if ! $flag; then
    echo "No brackets: Flag is $flag"
fi
if [ ! $flag ]; then
    echo "With brackets: Flag is $flag"
fi
echo "The end."
Run Code Online (Sandbox Code Playgroud)

哪个打印

$ ./test.sh
No brackets: Flag is False
The end.
Run Code Online (Sandbox Code Playgroud)

所以使用方括号的语句要么被忽略,要么被评估为 False。为什么会发生这种情况?括号有什么作用?

我也见过双括号。那些是怎么用的?

——

编辑:声称重复的问题(这个这个)只回答了这个问题的一小部分。我仍然不清楚为什么带括号的语法会失败(在我看来test ! false应该计算为true)以及为什么没有括号的语法会成功(尽管正如@ilkkachu 在评论中提到的,它似乎实际上也应该失败? )。

linux bash control-flow test

6
推荐指数
1
解决办法
6792
查看次数

如何根据退出代码的结果管道命令的标准输出

这个问题展开,我们有一个用例,我们希望根据该命令是成功还是失败来通过管道传输命令的标准输出。

我们从一个基本的管道开始

command | grep -P "foo"
Run Code Online (Sandbox Code Playgroud)

但是我们注意到有时command不会向 stdout 输出任何内容,但确实有退出代码0. 我们想忽略这种情况,只grep在退出代码是1

对于一个工作示例,我们可以实现这样的命令:

command | grep -P "foo"
Run Code Online (Sandbox Code Playgroud)

但这有许多缺点,即您必须编写脚本,这意味着您不能只在控制台中执行它。这似乎也有些业余。

为了更简洁的语法,我想象了一个虚构的三元运算符,如果退出代码是1,则它会进行管道传输,否则它将向前传递退出代码。

OUTPUT=$(command) # exit code is 0 or 1
RESULT=$?
if [ $RESULT -eq 0 ]; then
  return $RESULT; # if the exit code is 0 then we simply pass it forward
else
  grep -P "foo" <<< $OUTPUT; # otherwise check if the stdout contains "foo"
fi
Run Code Online (Sandbox Code Playgroud)

是否有一系列操作符和实用程序可以达到这个结果?

bash control-flow

6
推荐指数
2
解决办法
3059
查看次数

自动逐行运行脚本,但在从第二行开始的每一行之前都会被询问

我编写了一个大约 20 行的脚本,我发现自己通过复制粘贴和逐行执行一次又一次地测试。

与其复制粘贴每一行并点击Enter执行,我想复制粘贴整个脚本而不是一次性执行它(作为一个块或一个heredocument),而是以一种查询方式;例如:

  • 第一行 get 定期(无条件)执行,我被询问是否希望继续执行即将到来的行(在有足够的时间考虑输出之后);

  • 如果我选择继续——就这样吧,否则,操作就会中断;

  • (到目前为止的结果当然不会回滚,但我至少不会继续产生进一步有问题的结果);

这种模式应该一行一行地重复,直到脚本结束。

是否有实用程序可以帮助我以这种方式工作?

security shell-script exit testing control-flow

6
推荐指数
1
解决办法
729
查看次数

控制用户进程数的shell脚本

我必须启动一个程序的总数,NUMTOT(可以是任何,C,Mathematica,ns-2 ...数学环境)。问题是运行这些进程的计算机只允许最大执行次数,例如 MAX,(MAX < NUMTOT)。

我在终端中使用以下行运行这些程序

./run.sh -d directory num
Run Code Online (Sandbox Code Playgroud)

重复,其中 run.sh 是我调用数学程序的脚本;directory 是我的程序所在的目录,num 表示新执行的次数(integer*num = NUM​​)。脚本“run.sh”使用“目录”(程序)的副本创建“num”个目录,并启动“num”个程序实例。在我的情况下是 Matlab 实例。

我想要一个脚本来自动跟踪正在运行的进程数量以及最大数量何时减少到(MAX-num),因为'num'已经完成,然后启动Matlab的下一个'num'模拟,直到总数完成了 NUM 次模拟。

如果脚本能够在只有一个程序刚刚完成时调用下一个程序,就能够维护 MAX 可能的进程,那就更好了。

实际上,要知道正在运行的进程数,我运行以下脚本

ps axu |grep plopez|grep simulacion|grep MATLAB|awk '{ $2} END{print NR}'
Run Code Online (Sandbox Code Playgroud)

这给出了此时运行的总 Matlab。

我怎样才能仅从一个脚本中进行整套模拟?

shell-script control-flow matlab

5
推荐指数
1
解决办法
2317
查看次数

如果 !&lt;命令&gt; (...) 与 &lt;命令&gt; ;如果 [ $? -eq 0] (...)

我正在编写 shell 脚本,并决定通过shellcheck.net检查我的工作。我能够在脚本中获得以下两行的功能相同的行为:

findmnt /dev/sda1 >/dev/null ; if [ $? -eq 0 ]; then echo 1; else echo 0; fi
Run Code Online (Sandbox Code Playgroud)

if ! findmnt /dev/sda1 >/dev/null; then echo 0; else echo 1; fi
Run Code Online (Sandbox Code Playgroud)

然而 shellcheck会抛出

SC2181:直接使用“if mycmd;”检查退出代码,而不是间接使用$?。

我并不清楚该使用哪个。我确实看到: https: //github.com/koalaman/shellcheck/issues/1167似乎已针对几个可能的值对此进行了修改。我想确保我正在编写的内容使用最佳实践,并且可以毫无问题地运行并准确报告。

scripting control-flow shellcheck

5
推荐指数
1
解决办法
4327
查看次数

检测应用程序执行逻辑错误的工具

我想检测应用程序执行逻辑中的错误。例如:

  • 忘记调用free()返回的地址malloc()
  • 没有关闭返回的文件句柄open()
  • 无效标志传递给open()
  • 传递给的文件句柄无效poll()
  • write()调用未打开写入的 fd
  • 将无效标志传递给open()例如 open("/etc/fstab", 4)
  • 调用close()无效的 fd
  • ...

我想还有数百个。

ftrace也许该工具可以类似于或运行strace,但包含错误调用的内核日志也足够了。

programming debugging control-flow

5
推荐指数
1
解决办法
895
查看次数