要测试变量是否为只读,有以下丑陋的黑客:
# True if readonly
readonly -p | egrep "declare -[:lower:]+ ${var}="
# False if readonly
temp="$var"; eval $var=x 2>/dev/null && eval $var=\$temp
有更优雅的解决方案吗?
答案 0 :(得分:4)
使用子shell似乎有效。都有本地和导出的变量。
$ 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 :-)
重要的是,即使是你的RW(在这种情况下为$ bar)还没有在你当前的shell中设置这个子shell。
使用bash和ksh进行测试。
答案 1 :(得分:0)
您还可以向变量添加一个空字符串,它仍然保留其值,但比使用子shell更快,例如:
foo+= 2>/dev/null || echo "Read only"
捕获为一个函数,它是:
is-writable() { eval "$1+=" >2/dev/null; }