我想做类似的事情:
#!/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/')
答案 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