标签: scripting

echo ($x) 和 a="($x)" 之间的区别;回声$a

当我在终端中执行以下操作时:

x=1
a=($x)

echo $a    #output: 1
echo ($x)  #output: -bash: syntax error near unexpected token `$x'
Run Code Online (Sandbox Code Playgroud)

为什么上面的输出不同?还有为什么以下 2 个输出不同:

$(echo foo) #output: -bash: foo: command not found
(echo foo) #output: foo
Run Code Online (Sandbox Code Playgroud)

PS:我正在尝试理解命令替换:$(command)

shell scripting bash command-substitution

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

Ubuntu - “sudo iptables”命令在终端中有效,在 bash 脚本中无效

我正在使用一个简单的终端命令,它向 iptables 添加规则并且它执行没有问题:

sudo iptables -A OUTPUT -p tcp -m string --string "facebook.com" --algo kmp -j REJECT

当我在 bash 脚本中运行该命令时,它返回 sudo: ./script.sh: command not found

该脚本如下所示:

#!/bin/bash

sudo iptables -A OUTPUT -p tcp -m string --string "facebook.com" --algo kmp -j REJECT
Run Code Online (Sandbox Code Playgroud)

linux scripting sudo

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

如何获取安装在 debian 实例中的列表包作为另一台机器的离线安装

我已经将一个 debian 实例与 apt 作为安装了许多软件包的软件包管理器放在一起。我想在另一个没有互联网连接的系统上安装这些相同的软件包。有没有一种简单的方法来生成我已安装的软件包列表,按依赖项排序,获取软件包的 .deb 以便我可以在另一台计算机上安装?

我的目标也是能够通过重新生成包列表和 .deb 文件并使用它来进行更新来更新另一台计算机。

scripting packaging debian apt package-management

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

VS Code 编辑器 | 如何为 ShellCheck 包含 -x 开关?

问题描述及复现

在终端运行中:

shellcheck -x my_script
Run Code Online (Sandbox Code Playgroud)

哪里my_script来源另一个(部分)脚本。

-x开关没有错误,但如果我没有-x运行它:

shellcheck my_script
Run Code Online (Sandbox Code Playgroud)

我收到这样的通知:

. ./functions/my_function

  ^-- SC1091: Not following: ... was not specified as input (see shellcheck -x).
Run Code Online (Sandbox Code Playgroud)

GitHub 上的 SC1091


我的外壳检查

我正在使用位于以下位置的自编译 ShellCheck:

~/.cabal/bin/shellcheck
Run Code Online (Sandbox Code Playgroud)

目标

我正在使用Visual Studio Code GUI 文本编辑器。有没有办法强制-x开关在某处或其他解决方案?

scripting shellcheck visual-studio-code

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

带参数的循环函数在另一个带参数的循环函数中

# Print $1 $2 times
function foo() {
    for (( i=0; i<$2; i++ )); do
        echo -n $1
    done
    echo
}

# Print $1 $2x$3 times
function bar() {
    for (( i=0; i<$3; i++ )); do
        foo $1 $2
    done
}

bar $1 $2 $3
Run Code Online (Sandbox Code Playgroud)

的理想输出foobar.sh @ 3 3

@@@
@@@
@@@
Run Code Online (Sandbox Code Playgroud)

但实际输出似乎只是

@@@
Run Code Online (Sandbox Code Playgroud)

将变量更改为bar()fromij产生所需的输出。但为什么?

scripting bash function arguments

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

需要改进持续测试网站的脚本

需要改进不断测试网站的脚本。

目前已使用以下脚本,但它提供了大量失败的电子邮件,而网站仍在运行:

#!/bin/bash
while true; do
    date > wsdown.txt ;
    cp /dev/null pingop.txt ;
    ping -i 1 -c 1 -W 1 website.com > pingop.txt ;
    sleep 1 ;
    if grep -q "64 bytes" pingop.txt ; then
        :
    else
        mutt -s "Website Down!" bruno.bvaraujo@gmail.com < wsdown.txt ;
        sleep 10 ;
    fi
done
Run Code Online (Sandbox Code Playgroud)

现在或以某种方式改进此脚本或使用另一种方式思考。

networking scripting shell-script ping bourne-shell

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

将行范围写入文件(1 到 N)Bash、Awk 或 Sed 脚本

我已经从输入文件中提取了所需的行号(即 1 到 N)。我现在需要能够使用带有这个 1 到 N 的输入文件来输出到一个新文件。模式匹配已经发生在先前从输入文件中提取行号的函数中。现在我需要使用输入文件获取这个范围的数字并将该范围输出到一个新文件中。我不需要做任何模式匹配,只需要对一个新文件做 1 到 N。

我目前正在使用 bash 脚本和 Awk 提取必要的信息以从输入文件生成范围数据。现在我需要大发雷霆并创建一个从 1 到 N 的新文件(使用输入文件)。

我试过了

sed -i '1,'"$N" input.txt > input.log
Run Code Online (Sandbox Code Playgroud)

使用我的输入文件 input.txt 从 1 到 N 并输出到 input.log 文件,但出现以下错误:

sed: -e expression #1, char 3: missing command
Run Code Online (Sandbox Code Playgroud)

上面的代码行在 bash 脚本中。

scripting bash sed awk

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

如何 POSIX-ly 找出我在 shell 脚本中有多少 CPU 线程?

如何 POSIX-ly 找出我在 shell 脚本中有多少 CPU 线程?

我知道我可以以某种方式使用/proc/cpuinfo,但是如何仅获取重复行的计数,也许使用grep

grep scripting cpu shell-script posix

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

使用 jq 将 JSON 对象添加到数组

我的目标是使用bashjq中的find命令输出输出一个 JSON 对象。它可以是单行命令或 bash 脚本。

我有这个命令从每一行输出创建 JSON 对象:

find ~/ -maxdepth 1 -name "D*" | \
while read line; \
do jq -n \
--arg name "$(basename "$line")" \
--arg path "$line" \
'{name: $name, path: $path}'; \
done
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

{
  "name": "Desktop",
  "path": "/Users/username/Desktop"
}
{
  "name": "Documents",
  "path": "/Users/username/Documents"
}
{
  "name": "Downloads",
  "path": "/Users/username/Downloads"
}
Run Code Online (Sandbox Code Playgroud)

但是我需要将这些对象放在一个数组中,并且我需要该数组是父对象的单个键的值items,如下所示:

{"items": [
    {
      "name": "Desktop",
      "path": "/Users/username/Desktop"
    },
    {
      "name": "Documents",
      "path": "/Users/username/Documents"
    },
    { …
Run Code Online (Sandbox Code Playgroud)

scripting bash json jq

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

基于 if 语句的 Bash 标志

我正在以下列方式调用具有多个标志的 bash 脚本:

/home/username/myscript -a -b 76
Run Code Online (Sandbox Code Playgroud)

因此,为了说明,-a 标志在 myscript 中执行某些操作,而 -b 标志在 myscript 中将某些参数设置为 76。

如何根据某些先前定义的变量使这些标志成为条件?例如,如果某个变量 var=ON,我只想使用 -a 标志,否则我不知道使用该标志的内容。我正在寻找类似的东西:

var=ON
/home/username/myscript 
if [ "$var" == "ON" ]; then
-a
fi
-b 76
Run Code Online (Sandbox Code Playgroud)

然而,这个方案在实施时不起作用。什么可以用来实现预期的结果?

scripting bash shell-script

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