sh有条件地传递命令选项

时间:2018-02-11 01:09:27

标签: bash shell sh options

我想做类似的事情:

#!/bin/sh

[ -f "/tmp/nodes" ]
[[ $? -eq 0 ]] && VAL=$? ||

geth --datadir /root/.ethereum \
     ${VAL+"--nodekey \"/root/nodekey.txt\""} \     
     --networkid 1999 \
     --rpc \
     --rpcaddr "0.0.0.0" \

如果文件--nodekey "/root/nodekey.txt"存在,我希望传递选项/tmp/nodes。与具有两个几乎相同的命令的if相比,如何才能更优雅地完成?

- 编辑 -

这是迄今为止我能够工作的最好成绩:

if [ $VAL -eq 0 ]; then
    /geth --datadir /root/.ethereum \
          --nodekey "/root/nodekey.txt" \
          # No dice
          # Would be nice if this worked so I didn't need the if
          # ${VAL+ --nodekey "/root/nodekey.txt" } \
          --networkid 1999 \
          --rpc \
          --rpcaddr "0.0.0.0" 
else
    /geth --datadir /root/.ethereum \
          --networkid 1999 \
          --rpc \
          --rpcaddr "0.0.0.0" \
fi

这是文件中的另一行并且工作正常:

ENODE_URL=$(/geth --datadir /root/.ethereum ${VAL+ --nodekey "/root/nodekey.txt"} --exec "${JS}" console 2>/dev/null | sed -e 's/^"\(.*\)"$/\1/')

1 个答案:

答案 0 :(得分:1)

这里有一个基础,但它是[[ $? -eq 0 ]],因为[[是bash采用的ksh扩展。在这里完全使用$?是没有意义的,因为您可以根据test -f是否成功直接执行作业:

touch /tmp/nodes  # set us up for the truthy path
if test -f /tmp/nodes; then tmp_nodes_exists=1; else unset tmp_nodes_exists; fi
printf '%s\n' /tmp/nodes ${tmp_nodes_exists+"REALLY EXISTS" "(yes, really)"}

...正确地作为输出发出(与dash一起运行,也许是最常见的最小/bin/sh解释器):

/tmp/nodes
REALLY EXISTS
(yes, really)

相比之下,要证明另一条路径应该失败:

rm -f -- /tmp/nodes  # set us up for the falsey path
if test -f /tmp/nodes; then tmp_nodes_exists=1; else unset tmp_nodes_exists; fi
printf '%s\n' /tmp/nodes ${tmp_nodes_exists+"REALLY EXISTS" "(yes, really)"}

仅作为输出发出:

/tmp/nodes