标签: shell-script

测试服务是否在脚本中运行的“正确”方法

我的问题:

我正在编写一个 bash 脚本,我想在其中检查给定的服务是否正在运行。

我知道如何手动执行此操作,使用$ service [service_name] status.

但是(尤其是在转向 systemd 之后)会打印一大堆文本,解析起来有点麻烦。我假设有一个为脚本制作的命令,带有简单的输出或我可以检查的返回值。

但是谷歌搜索只会产生大量“哦,只是ps aux | grep -v grep | grep [service_name]”的结果。这不可能是最佳做法,是吗?如果该命令的另一个实例正在运行,但不是由 SysV init 脚本启动的呢?

还是我应该闭嘴,用一点 pgrep 弄脏我的手?

shell-script systemd

195
推荐指数
6
解决办法
20万
查看次数

将命名参数传递给 shell 脚本

有没有什么简单的方法可以将命名参数传递(接收)给 shell 脚本?

例如,

my_script -p_out '/some/path' -arg_1 '5'
Run Code Online (Sandbox Code Playgroud)

并在内部my_script.sh将它们接收为:

# I believe this notation does not work, but is there anything close to it?
p_out=$ARGUMENTS['p_out']
arg1=$ARGUMENTS['arg_1']

printf "The Argument p_out is %s" "$p_out"
printf "The Argument arg_1 is %s" "$arg1"
Run Code Online (Sandbox Code Playgroud)

这在 Bash 或 Zsh 中可能吗?

bash zsh shell-script arguments

192
推荐指数
8
解决办法
28万
查看次数

$VAR vs ${VAR} 以及引用或不引用

我可以写

VAR=$VAR1
VAR=${VAR1}
VAR="$VAR1"
VAR="${VAR1}"
Run Code Online (Sandbox Code Playgroud)

最终结果对我来说似乎都差不多。我为什么要写一个或另一个?这些中的任何一个都不是便携式/ POSIX 吗?

shell shell-script environment-variables posix quoting

184
推荐指数
3
解决办法
8万
查看次数

并行化 Bash FOR 循环

我一直在尝试使用 GNU Parallel 并行化以下脚本,特别是三个 FOR 循环实例中的每一个,但未能实现。FOR 循环中包含的 4 个命令串联运行,每个循环大约需要 10 分钟。

#!/bin/bash

kar='KAR5'
runList='run2 run3 run4'
mkdir normFunc
for run in $runList
do 
  fsl5.0-flirt -in $kar"deformed.nii.gz" -ref normtemp.nii.gz -omat $run".norm1.mat" -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12 
  fsl5.0-flirt -in $run".poststats.nii.gz" -ref $kar"deformed.nii.gz" -omat $run".norm2.mat" -bins 256 -cost corratio -searchrx -90 90 -searchry -90 90 -searchrz -90 90 -dof 12 
  fsl5.0-convert_xfm -concat $run".norm1.mat" -omat $run".norm.mat" $run".norm2.mat"
  fsl5.0-flirt -in $run".poststats.nii.gz" -ref normtemp.nii.gz -out $PWD/normFunc/$run".norm.nii.gz" …
Run Code Online (Sandbox Code Playgroud)

shell-script gnu-parallel

180
推荐指数
8
解决办法
22万
查看次数

shell 脚本中的变量是否有命名约定?

大多数语言都有变量的命名约定,我在 shell 脚本中看到的最常见的样式是MY_VARIABLE=foo. 这是惯例还是仅适用于全局变量?脚本本地的变量呢?

shell bash shell-script variable

176
推荐指数
3
解决办法
10万
查看次数

我可以同时将输出重定向到日志文件和后台进程吗?

我可以同时将输出重定向到日志文件和后台进程吗?

换句话说,我可以做这样的事情吗?

nohup java -jar myProgram.jar 2>&1 > output.log &
Run Code Online (Sandbox Code Playgroud)

或者,这不是合法的命令吗?或者,我是否需要手动将其移动到后台,如下所示:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
Run Code Online (Sandbox Code Playgroud)

shell bash shell-script

176
推荐指数
5
解决办法
36万
查看次数

在 shell 脚本中使用 shift 的目的是什么?

我遇到了这个脚本:

#! /bin/bash                                                                                                                                                                                           

if (( $# < 3 )); then
  echo "$0 old_string new_string file [file...]"
  exit 0
else
  ostr="$1"; shift
  nstr="$1"; shift  
fi

echo "Replacing \"$ostr\" with \"$nstr\""
for file in $@; do
  if [ -f $file ]; then
    echo "Working with: $file"
    eval "sed 's/"$ostr"/"$nstr"/g' $file" > $file.tmp 
    mv $file.tmp $file
  fi  
done
Run Code Online (Sandbox Code Playgroud)

他们使用的行的含义是什么shift?我认为脚本应该至少与参数一起使用,所以......?

shell-script arguments

173
推荐指数
3
解决办法
22万
查看次数

如何在脚本中编写重试逻辑以继续重试最多运行 5 次?

我想在 shell 脚本中编写逻辑,如果由于某些问题而失败,它将根据“状态代码 = FAIL”在 15 秒后重试运行最多 5 次。

shell-script

167
推荐指数
9
解决办法
17万
查看次数

使用不等于运算符进行字符串比较

我试图检查PHONE_TYPE变量是否包含三个有效值之一。

if [ "$PHONE_TYPE" != "NORTEL" ] || [ "$PHONE_TYPE" != "NEC" ] ||
   [ "$PHONE_TYPE" != "CISCO" ]
then
    echo "Phone type must be nortel,cisco or nec"
    exit
fi
Run Code Online (Sandbox Code Playgroud)

上面的代码对我不起作用,所以我尝试了这个:

if [ "$PHONE_TYPE" == "NORTEL" ] || [ "$PHONE_TYPE" == "NEC" ] ||
   [ "$PHONE_TYPE" == "CISCO" ]
then
    :        # do nothing
else
    echo "Phone type must be nortel,cisco or nec"
    exit
fi
Run Code Online (Sandbox Code Playgroud)

这种类型的任务有更干净的方法吗?

shell shell-script

165
推荐指数
4
解决办法
58万
查看次数

从脚本确定 Git 工作目录是否干净

我有一个rsync以 Git 工作目录作为目标运行的脚本。我希望脚本根据工作目录是否干净(没有更改提交)而具有不同的行为。例如,如果输出git status如下,我希望脚本退出:

git status
Already up-to-date.
# On branch master
nothing to commit (working directory clean)
Everything up-to-date
Run Code Online (Sandbox Code Playgroud)

如果目录不干净,那么我希望它执行更多命令。

如何在 shell 脚本中检查上述输出?

git shell-script

154
推荐指数
4
解决办法
6万
查看次数