我一直在看其他人写的一些脚本(特别是 Red Hat),他们的很多变量都是使用以下符号分配的
VARIABLE1="${VARIABLE1:-some_val}"
或一些扩展其他变量
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
使用这种表示法而不是直接声明值有什么意义(例如, VARIABLE1=some_val)有什么意义?
这种表示法是否有好处或可以防止可能出现的错误?
是否:-有特定的含义在这方面?
有一个内置的 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) 我想要一个将当前工作目录带到变量的脚本。需要目录的部分是这样的dir = pwd。它只是打印pwd如何将当前工作目录放入变量中?
该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 …
我编写了以下脚本来比较两个目录的输出,其中包含所有相同的文件:
#!/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) 我想制作一个自动脚本,该脚本调用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
我编写了一个在本地执行时运行良好的脚本:
./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)
请告诉我我做错了什么,这非常令人沮丧。
我可以读取数字和操作:
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”)时,似乎我仍然得到字符串。
我在 Unix 和 Linux 以及其他使用短语“反引号已被弃用”的站点上多次看到此评论,这与 Bash 和 Zsh 等 shell 相关。
这个说法是真的还是假的?
我是 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)
怎么可能?