D1325.sh (2098B)
1 #!/bin/bash 2 3 function print-header { 4 echo 5 printf '%s\n' "$@" 6 } 7 8 print-header 'Q0. readonly 属性は解除できないし変数も削除できない。' 9 ( 10 var=aaa 11 declare -g -r aaa 12 declare -p aaa 13 echo "\${param+-} ... ${aaa+set}${aaa-unset}" 14 echo "\${param+-} ... ${!var+set}${!var-unset}" 15 declare +r aaa 2>/dev/null || echo cannot reset rflag 16 unset -v aaa 2>/dev/null || echo cannot unset readonly var 17 ) 18 19 20 print-header 'Q1 外側のスコープの変数に対して -r を付加できるか。' \ 21 '→readonly で付加する事ができる。' 22 ( 23 v1=1 24 function f1 { readonly v1; } 25 f1 26 declare -p v1 27 ) 28 29 print-header 'Q2. typeset を実行すると新しく変数が関数内に作られる。' 30 ( 31 v1=1 32 function f1 { typeset -r v1; } 33 f1 34 declare -p v1 35 ) 36 37 print-header 'Q3. 存在しない変数に対して readonly を呼び出すと何が起こるか。' \ 38 '→どうやらグローバルの slot に readonly が付加される様子だ。' 39 ( 40 function f1 { readonly v1; declare -p v1; } 41 f1 42 declare -p v1 43 ) 44 45 print-header 'Q4. readonly を付加したグローバル変数と同名のローカル変数は作れない筈。' 46 ( 47 readonly v1=1 48 function f1 { local v1=1 2>/dev/null || echo fail; } 49 f1 50 ) 51 52 print-header 'Q5. readonly を付加した局所変数の場合は局所変数を作れる' 53 ( 54 function f1 { local -r v1=1; f2; } 55 function f2 { local v1=2 2>/dev/null || echo fail; declare -p v1; } 56 f1 57 ) 58 59 function is-global/test { ! local "$1" 2>/dev/null; } 60 function is-global { (readonly "$1"; is-global/test "$1"); } 61 print-header 'Q6. is-global は readonly を使って実装できる。' 62 ( 63 v1=1 v2=2 64 function f1 { 65 local v2=22 v3=33 66 f2 67 } 68 function f2 { 69 local v4=444 70 is-global v0 && echo v0:ok 71 is-global v1 && echo v1:ok 72 is-global v2 || echo v2:ok 73 is-global v3 || echo v3:ok 74 is-global v4 || echo v4:ok 75 } 76 f1 77 ) 78 79 print-header 'Q7 readonly ローカル変数は unlocal できない。' 80 ( 81 v1=g 82 function f1 { local -r v1=L; f2; } 83 function f2 { unset v1; declare -p v1; } 84 f1 85 )