Test if a variable is read-only

问题

为了测试一个变量是否是只读的,有以下丑陋的黑客:

# True if readonly
readonly -p | egrep "declare -[:lower:]+ ${var}="

# False if readonly
temp="$var"; eval $var=x 2>/dev/null && eval $var=\$temp

有没有更优雅的解决方案?

回答1

使用 subshel​​l 似乎有效。 具有本地和导出变量。

$ foo=123
$ bar=456

$ readonly foo

$ echo $foo $bar
123 456

$ (unset foo 2> /dev/null) || echo "Read only"
Read only

$ (unset bar 2> /dev/null) || echo "Read only"
$

$ echo $foo $bar
123 456           # Still intact :-)

重要的是,子shell 甚至可以挽救您的 RW(在这种情况下为 $bar)在当前 shell 中未设置。

用 bash 和 ksh 测试。

回答2

您还可以向变量添加一个空字符串,它仍然保留其值,但比使用子外壳更快,例如:

foo+= 2>/dev/null || echo "Read only"

捕获为函数,它将是:

is-writable() { eval "$1+=" >2/dev/null; }
标签

更多相关内容:请点击查看