如何从子 shell 或替代品中获取值?
How to obtain a value from a subshell or an alternative?
我对用户 INSERT_AT
的 read
值有以下验证方法。 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."
我对用户 INSERT_AT
的 read
值有以下验证方法。 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."