标签: scripting

&& 和 || 的混淆使用 运营商

我正在浏览一个/etc/rc.d/init.d/sendmail文件(我知道这几乎从未使用过,但我正在为考试而学习),并且我对&&||运算符感到有些困惑。我已经阅读了它们可以在以下语句中使用的地方:

if [ test1 ] && [ test2 ]; then
     echo "both tests are true"
elif [ test1 ] || [ test2 ]; then
     echo "one test is true"
fi
Run Code Online (Sandbox Code Playgroud)

但是,此脚本显示单行语句,例如:

[ -z "$SMQUEUE" ] && SMQUEUE="QUEUE"
[ -f /usr/sbin/sendmail ] || exit 0
Run Code Online (Sandbox Code Playgroud)

这些似乎使用&&and||运算符来根据测试得出响应,但我无法挖掘有关这些运算符的这种特殊用途的文档。任何人都可以解释这些在这种特定情况下的作用吗?

shell scripting bash control-flow

119
推荐指数
4
解决办法
41万
查看次数

shebang 是否确定运行脚本的 shell?

这可能是一个愚蠢的问题,但我仍然问它。如果我已经宣布了一个shebang

#!/bin/bash 
Run Code Online (Sandbox Code Playgroud)

在开始时my_shell_script.sh,我是否总是必须使用 bash 调用此脚本

[my@comp]$bash my_shell_script.sh
Run Code Online (Sandbox Code Playgroud)

或者我可以使用例如

[my@comp]$sh my_shell_script.sh
Run Code Online (Sandbox Code Playgroud)

我的脚本使用shebang确定正在运行的shell?难道同样的事情发生与ksh壳呢?我正在使用 AIX。

scripting executable shebang

110
推荐指数
4
解决办法
8万
查看次数

在脚本中使用 $"dollarsign-prefixed string" 是什么意思?

我刚刚在初始化脚本中看到了这一点:

echo $"Stopping Apache"
Run Code Online (Sandbox Code Playgroud)

那个美元符号是干什么用的?

到目前为止我的研究:

我在 bash 手册中找到了这个:

引述

如果设置,$'string'并且在双引号括起来的扩展中$"string"执行${parameter}引用。默认情况下启用此选项。

...但我没有发现带$前缀和不带前缀的字符串之间有任何区别:

$ echo "I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in $PWD"
I am in /var/shared/home/southworth/qed
$ echo $"I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo "I am in ${PWD}"
I am in /var/shared/home/southworth/qed
$ echo 'I am in ${PWD}'
I am in ${PWD}
$ echo $'I am in ${PWD}'
I am in ${PWD} …
Run Code Online (Sandbox Code Playgroud)

scripting bash shell-script quoting

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

su 选项 - 以另一个用户身份运行命令

我想知道如何从脚本中以另一个用户身份运行命令。

我将脚本的所有者设置为 root。我还在脚本中运行以下命令以作为 hudson 用户运行命令:

su -c command hudson
Run Code Online (Sandbox Code Playgroud)

这是正确的语法吗?

scripting bash su sudo

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

使用 while 循环 ssh 到多个服务器

我有一个文件servers.txt,其中包含服务器列表:

server1.mydomain.com
server2.mydomain.com
server3.mydomain.com
Run Code Online (Sandbox Code Playgroud)

当我逐行读取文件while并回显每一行时,一切都按预期工作。打印所有行。

$ while read HOST ; do echo $HOST ; done < servers.txt
server1.mydomain.com
server2.mydomain.com
server3.mydomain.com
Run Code Online (Sandbox Code Playgroud)

但是,当我想通过 ssh 连接到所有服务器并执行命令时,我的while循环突然停止工作:

$ while read HOST ; do ssh $HOST "uname -a" ; done < servers.txt
Linux server1 2.6.30.4-1 #1 SMP Wed Aug 12 19:55:12 EDT 2009 i686 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

这仅连接到列表中的第一台服务器,而不是所有服务器。我不明白这里发生了什么。有人可以解释一下吗?

这更奇怪,因为使用for循环工作正常:

$ for HOST in $(cat servers.txt ) ; do ssh $HOST "uname -a" ; done
Linux server1 2.6.30.4-1 #1 SMP …
Run Code Online (Sandbox Code Playgroud)

scripting ssh io-redirection

95
推荐指数
3
解决办法
20万
查看次数

更改当前目录的脚本(cd、pwd)

我想运行一个脚本来简单地更改当前工作目录:

#!/bin/bash
cd web/www/project
Run Code Online (Sandbox Code Playgroud)

但是,运行后,当前密码保持不变!我怎样才能做到这一点?

scripting bash cd-command environment-variables

93
推荐指数
5
解决办法
26万
查看次数

如何从进程中获取整个命令行?

如何使用进程名称从正在运行的进程中获取命令参数或整个命令行?

例如这个过程:

# ps
PID   USER     TIME   COMMAND
 1452 root       0:00 /sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid
Run Code Online (Sandbox Code Playgroud)

我想要的是/sbin/udhcpc -b -T 1 -A 12 -i eth0 -p /var/run/udhcpc.eth0.pid或争论。我知道进程名称并想要它的参数。我在 SliTaz 上使用 Busybox。

scripting process ps busybox

92
推荐指数
4
解决办法
15万
查看次数

如何同时grep相同的字符串但多个文件?

我有一组需要查看的日志文件,我想一次在同一文件上搜索特定字符串 这可能吗?目前我正在使用

grep -E 'fatal|error|critical|failure|warning|' /path_to_file
Run Code Online (Sandbox Code Playgroud)

如何使用它并一次搜索多个文件的字符串?如果这是需要编写脚本的内容,有人可以提供一个简单的脚本来执行此操作吗?

grep scripting

89
推荐指数
4
解决办法
34万
查看次数

如何抑制 grep 的输出,使其仅返回退出状态?

我有grep命令。我正在从文件中搜索关键字,但我不想显示匹配项。我只想知道grep.

grep scripting shell-script

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

如果 shell 脚本的一部分失败,如何退出它?

如果其中一部分失败,如何编写退出的 shell 脚本?例如,如果以下代码片段失败,则脚本应退出。

n=0
until [ $n -ge 5 ]
do
  gksu *command* && break
  n=$[$n+1]
  sleep 3
Run Code Online (Sandbox Code Playgroud)

scripting bash error-handling

78
推荐指数
4
解决办法
21万
查看次数