如何从子 shell 或替代品中获取值?

How to obtain a value from a subshell or an alternative?

我对用户 INSERT_ATread 值有以下验证方法。 INSERT_AT 应该在整数范围内 (0 < INSERT_AT < BOOKLENGTH),其中 $BOOKLENGTH 可以 由另一种方法提供 getLength().

像这样:

readValidInsertAt() {
  INSERT_AT=

  while ! { isValidArgument "$INSERT_AT" && isArgumentNumeric "$INSERT_AT" && isArgumentInRange "$INSERT_AT"; }; do
    echo -e 'Insert at?: \c'
    read -r INSERT_AT
  done
}

isArgumentInRange() {
  ARGUMENT=  

  # Smelly code here :(

  cd manuscript || exit;
  getLength
  cd ..

  if [[ "$ARGUMENT" -le "$BOOKLENGTH" ]] && [[ "$ARGUMENT" -ge 0 ]] ; then
    return 0
  else
    return 1
  fi

}

问题是我在执行 getLength() 之前将 CD 放入目录,然后 CD .. 再次返回以获取 $BOOKLENGTH。也许我想避免使用子 shell (...)

getLength() {
  BOOKLENGTH=1
  until [ ! -d "page-$((BOOKLENGTH+1))"  ]; do
    BOOKLENGTH=$((BOOKLENGTH+1))
  done
}

length() {
  if [ -d manuscript/ ] ; then
    (cd manuscript || exit; getLength; echo "Book length is: ${BOOKLENGTH} pages.")
  else 
    echo "Manuscript not found, probably not in project root!"
  fi
}

有没有办法或好的模式来做到这一点?我的代码有效,但我对此不满意。

在子shell 中设置的变量永远不会在父shell 中看到。您可以让 subshell 回显变量,然后将其分配给父变量中的变量:

BOOKLENGTH=$(cd manuscript || exit; getLength; echo $BOOKLENGTH)
echo "Book length is: $BOOKLENGTH pages."