向脚本添加一些试运行选项

Jim*_*Jim 0 shell bash shell-script

我有一个接受参数的脚本,如果未设置,则使用默认值。

VALUE=$1
if [[ -z "$VALUE" ]];  
   VALUE=foo #some function returns the default  
fi  
Run Code Online (Sandbox Code Playgroud)

然后脚本继续做一些事情。
我想“增强”它并提供一些dry run选择。因此,如果通过了,我们将有类似的东西

if [[ -z "$DRY" ]];  
  echo "command x y z"  
else 
  command "x" "y" "z"  
fi  
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Kus*_*nda 5

进行适当的命令行解析,然后选择如何进行实际的空运行。

命令行解析:

#!/bin/sh

dry_run=false

while getopts 'n' opt; do
    case "$opt" in
        n) dry_run=true ;;
        *) echo 'error in command line parsing' >&2
           exit 1
    esac
done
Run Code Online (Sandbox Code Playgroud)

现在,$dry_runtrue在用户与调用脚本-n的命令行选项。

然后,选择如何进行空运行。一个简单的方法是使用set -v(显示 shell 读取的命令),然后是set -n(实际上不运行任何东西):

if "$dry_run"; then
    set -v
    set -n
fi
Run Code Online (Sandbox Code Playgroud)

这可能不是您想要的,因为它只会显示脚本。

相反,你可以选择做

if "$dry_run"; then
    cmd=echo
else
    cmd=''
fi
Run Code Online (Sandbox Code Playgroud)

然后在您想要试运行的特定命令前加上前缀$cmd

$cmd ls -l
$cmd echo "hello world"
Run Code Online (Sandbox Code Playgroud)

  • `$cmd ls` 的技巧真是太棒了! (2认同)