当用户点击read
validate() {
local validated=false
while [ "$validated" != "true" ]; do
read -p "$1 " $2
$2=${2:-y}
if [[ "$2" == "y" || "$2" == "n" ]]; then
validated=true
fi
done
}
当我使用validate "text" test
运行此功能并使用enter跳过read
时,会显示错误test=test: command not found
。
如何使用函数参数替换?
答案 0 :(得分:2)
要使用动态名称为变量写入值,可以使用printf -v "$name" "$value"
。
这应该更接近你想要的,
虽然我怀疑还有一些混乱和后续问题:
validate() {
local message=$1
local out=$2
local validated=false answer
while [ "$validated" != true ]; do
read -p "$message " answer
answer=${answer:-y}
if [[ "$answer" == "y" || "$answer" == "n" ]]; then
validated=true
fi
done
printf -v "$out" "$answer"
}
答案 1 :(得分:1)
有几个问题,但您可以通过语句
看到最简单的问题$2=${2:-y}
假设用户将字符串FOO作为第二个参数传递。该声明变为
FOO=FOO
当然不是你所期望的。现在假设没有传递第二个参数。在这种情况下,$2
计算为空字符串,$2=${2:-y}
计算为 y 。因此,该陈述变为
=y
甚至语法不正确。考虑到这一点,你可以看到你的
read -p "$1 " $2
也没有意义。
编写函数时,最好的方法是不在算法本身中使用位置参数(除非你有充分的理由这样做),而是将它们分配给变量并使用变量,如@janos在他的建议中所证明的那样解。它不仅更安全,而且使您的程序更容易理解。