sistema_progs

Programas para customizar o meu entorno de traballo nos meus equipos persoais
Log | Files | Refs

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 )