标签: scripting

在脚本中使用“${a:-b}”进行变量赋值

我一直在看其他人写的一些脚本(特别是 Red Hat),他们的很多变量都是使用以下符号分配的 VARIABLE1="${VARIABLE1:-some_val}" 或一些扩展其他变量 VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"

使用这种表示法而不是直接声明值有什么意义(例如, VARIABLE1=some_val)有什么意义?

这种表示法是否有好处或可以防止可能出现的错误?

是否:-有特定的含义在这方面?

scripting bash shell-script variable

593
推荐指数
3
解决办法
44万
查看次数

永远每 x 秒重复一次 Unix 命令

有一个内置的 Unix 命令,repeat它的第一个参数是重复命令的次数,其中命令(带有任何参数)由 的其余参数指定repeat

例如,

% repeat 100 echo "I will not automate this punishment."
Run Code Online (Sandbox Code Playgroud)

将回显给定的字符串 100 次,然后停止。

我想要一个类似的命令——让我们称之为forever——它的工作原理类似,除了第一个参数是重复之间暂停的秒数,它会永远重复。例如,

% forever 5 echo "This will get echoed every 5 seconds forever and ever."
Run Code Online (Sandbox Code Playgroud)

我想我会在写之前问这样的事情是否存在。我知道它就像一个 2 行的 Perl 或 Python 脚本,但也许有更标准的方法来做到这一点。如果没有,请随时用您喜欢的脚本语言发布解决方案。

PS:也许更好的方法是将repeat重复次数(-1 表示无穷大)和重复之间的睡眠秒数进行概括。上面的例子将变成:

% repeat 100 0 echo "I will not automate this punishment."
% repeat -1 5 echo "This will get echoed every 5 seconds forever."
Run Code Online (Sandbox Code Playgroud)

command-line scripting

564
推荐指数
9
解决办法
60万
查看次数

如何获取当前工作目录?

我想要一个将当前工作目录带到变量的脚本。需要目录的部分是这样的dir = pwd。它只是打印pwd如何将当前工作目录放入变量中?

shell scripting bash directory

256
推荐指数
4
解决办法
93万
查看次数

允许在 shell 脚本上使用 setuid

setuid权限位告诉Linux与业主,而不是执行者的有效用户ID运行程序:

> cat setuid-test.c

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv) {
    printf("%d", geteuid());
    return 0;
}

> gcc -o setuid-test setuid-test.c
> ./setuid-test

1000

> sudo chown nobody ./setuid-test; sudo chmod +s ./setuid-test
> ./setuid-test

65534
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于可执行文件;shell 脚本忽略 setuid 位:

> cat setuid-test2

#!/bin/bash
id -u

> ./setuid-test2

1000

> sudo chown nobody ./setuid-test2; sudo chmod +s ./setuid-test2
> ./setuid-test2

1000
Run Code Online (Sandbox Code Playgroud)

维基百科

由于安全漏洞的可能性增加,许多操作系统在应用于可执行 shell 脚本时会忽略 setuid 属性。

假设我愿意接受这些风险,有没有办法告诉 Linux 将 shell 脚本上的 setuid …

shell security scripting setuid

223
推荐指数
7
解决办法
18万
查看次数

循环遍历名称中带有空格的文件?

我编写了以下脚本来比较两个目录的输出,其中包含所有相同的文件:

#!/bin/bash

for file in `find . -name "*.csv"`  
do
     echo "file = $file";
     diff $file /some/other/path/$file;
     read char;
done
Run Code Online (Sandbox Code Playgroud)

我知道还有其他方法可以实现这一目标。奇怪的是,当文件中有空格时,这个脚本会失败。我该如何处理?

find 的示例输出:

./zQuery - abc - Do Not Prompt for Date.csv
Run Code Online (Sandbox Code Playgroud)

scripting bash find text-processing filenames

187
推荐指数
6
解决办法
25万
查看次数

没有密码的自动 ssh-keygen,如何?

我想制作一个自动脚本,该脚本调用ssh-keygen并创建一些稍后将使用的发布/私有密钥对。原则上一切正常....
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
...除了它要求我提供加密密钥的密码。这使得 - 目前 - 自动化变得困难。

我可以通过命令行参数提供密码-N thepassphrase,以防止出现提示。我什至不希望拥有密钥——另外通过加密保护——并且希望密钥对是明文。

这个问题的(最佳)解决方案是什么?

-q据称意味着“安静/静音”的选项仍然无法避免密码短语交互。我也没有找到这样的东西
ssh-keygen ... -q --no-passphrase

请不要开始说教或教导我“缺少密码”的利弊,我知道这一点。在交互式表单中(不是作为脚本),用户只需按两次 [ENTER],密钥将被保存为纯文本。这就是我想在这样的脚本中实现的目标:

#!/bin/bash

命令 1
命令 2
var=$(command3)

# 这不应该停止脚本并要求输入密码
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q

scripting ssh

146
推荐指数
4
解决办法
18万
查看次数

如何在远程机器上执行本地脚本并包含参数?

我编写了一个在本地执行时运行良好的脚本:

./sysMole -time Aug 18 18
Run Code Online (Sandbox Code Playgroud)

参数"-time""Aug""18""18"成功传递给脚本。

现在,这个脚本被设计为在远程机器上执行,但是从本地机器上的本地目录执行。例子:

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole
Run Code Online (Sandbox Code Playgroud)

这也很好用。但是当我尝试包含上述参数(-time Aug 18 18) 时,问题就出现了,例如:

ssh root@remoteServer "bash -s" < /var/www/html/ops1/sysMole -time Aug 18 18
Run Code Online (Sandbox Code Playgroud)

运行该脚本后,我收到以下错误:

bash: cannot set terminal process group (-1): Invalid argument
bash: no job control in this shell
Run Code Online (Sandbox Code Playgroud)

请告诉我我做错了什么,这非常令人沮丧。

shell scripting bash options shell-script

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

如何使用 bash 添加(减去等)两个数字?

我可以读取数字和操作:

echo "First number please"
read num1
echo "Second number please"
read num2
echo "Operation?"
read op
Run Code Online (Sandbox Code Playgroud)

但随后我所有添加数字的尝试都失败了:

case "$op" in
  "+")
    echo num1+num2;;
  "-")
    echo `num1-num2`;;
esac
Run Code Online (Sandbox Code Playgroud)

跑:

First number please
1
Second mumber please
2
Operation?
+
Run Code Online (Sandbox Code Playgroud)

输出:

num1+num2
Run Code Online (Sandbox Code Playgroud)

...或者...

echo $num1+$num2;;

# results in: 1+2    
Run Code Online (Sandbox Code Playgroud)

...或者...

echo `$num1`+`$num2`;;

# results in: ...line 9: 1: command not found
Run Code Online (Sandbox Code Playgroud)

当我尝试添加添加(“2+2”而不是“4”)时,似乎我仍然得到字符串。

scripting bash variable

143
推荐指数
4
解决办法
37万
查看次数

*sh shell 中的反引号(即`cmd`)是否已被弃用?

我在 Unix 和 Linux 以及其他使用短语“反引号已被弃用”的站点上多次看到此评论,这与 Bash 和 Zsh 等 shell 相关。

这个说法是真的还是假的?

shell scripting bash zsh shell-script

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

将命令行参数传递给 bash 脚本

我是 bash 脚本编程的新手。

我想实现一个 bash 脚本“deploymLog”,它接受一个字符串参数(名称)作为输入。

[root@localhost Desktop]# ./deploymLog.sh name
Run Code Online (Sandbox Code Playgroud)

这里我想通过命令行传递字符串参数(名称)

作为初始步骤,我需要将当前时间戳与此输入字符串一起附加到日志文件Logone.txt中,该文件位于当前目录中,格式如下:

[name]=[System time timestamp1]
Run Code Online (Sandbox Code Playgroud)

怎么可能?

shell scripting bash

135
推荐指数
3
解决办法
52万
查看次数