在脚本中使用`set -e`可防止bash中的((var ++))增量

时间:2018-03-02 15:55:25

标签: bash

set.seed(123)
df <- data.frame(loc.id = rep(1:9, each = 9), month = rep(1:9,times = 9), 
                 x = runif(81, min = 0, max = 5))

df <- df %>% 
  mutate(x = x/loc.id)

仅返回0,但删除#!/bin/bash set -e a=0 echo $a ((a++)) echo $a 并返回0然后返回1,为什么((a ++))返回非零状态?

2 个答案:

答案 0 :(得分:2)

考虑以下三个事实,结合使用:

  • (( a++ ))是一个后增量 - 它的返回值取决于增量发生前的值。
  • 在数值上下文中,零值为false。
  • 如果任何未经检查的命令具有错误的退出状态,
  • set -e会指示shell退出。

因此,在bash 4.1为案例做出显式异常之前(根据算术表达式的退出状态阻止set -e激活),内容求值为0的数值上下文将导致shell退出

对于手头的具体案例,您可以使用preincrement - (( ++a ))来解决此问题。

set -eVue.component('child', { template: '#child', //The child has a prop named 'value'. v-model will automatically bind to this prop props: ['value'], methods: { updateValue: function (value) { //Not sure if both fields should call the same updateValue method that returns the complete object, or if they should be separate this.$emit('input', value); } } }); new Vue({ el: '#app', data: { parentObject: {value1: "1st Value", value2: "2nd value"} } });的行为不直观且容易出错(除了many respects之外)。因此它的使用是正确的。

答案 1 :(得分:0)

达菲解释了为什么&#39;很好。经过一番搜索,我也在看这个答案https://askubuntu.com/a/706683

在考虑了表现之后,我将来会使用这个表格:

#!/bin/bash
set -e
a=0
echo $a
((++a))
echo $a

我可能会避免使用set -e,而是在需要时测试返回值。