201512-setvalue.sh (2384B)
1 #!/usr/bin/env bash 2 3 if [[ ! ${BLE_VERSION-} ]]; then 4 source ../../src/benchmark.sh 5 fi 6 7 ifold -s -w 80 -i <<EOF 8 9 変数名が不明の場合に値を設定する方法について。 10 printf -v を用いた配列名に対する代入は bash-4.1 以降でしかできない。 11 12 比較してみたが eval を用いても、関数呼出で printf を用いても大差ないようだ。\ 13 記述が簡単になる関数呼出で printf を用いる方法を採用する事にする。\ 14 bash-4.1 未満の場合には保険の為、関数呼出で eval を用いる方法にする。 15 16 builtin eval, builtin printf, builtin read 等のように builtin を開始呼び出すと、\ 17 関数内では 3.5 us 程度ずつ、直接 eval だと 5.8us ずつ遅くなる様である。\ 18 全体の処理時間に比べれば 5% - 20% 程度である。余り気にしなくて良いと思う。 19 20 EOF 21 22 hello=12345 var=hello value=12345 23 ble-measure 'hello=12345' 24 ble-measure '(($var=value))' 25 ble-measure 'printf -v "$var" %s "$value"' 26 ble-measure 'eval "$var=\"\$value\""' 27 ble-measure "IFS= read -r -d '' \"\$var\" <<< \"\$value\"" 28 29 flag_function_assign= 30 31 if [[ $flag_function_assign ]]; then 32 function ble/util/set.printf { 33 printf -v "$1" %s "$2" 34 } 35 function ble/util/set.eval { 36 eval "$1=\"\$2\"" 37 } 38 function ble/util/set.read { 39 IFS= read -r -d '' "$1" <<<"$2" 40 } 41 ble-measure 'ble/util/set.printf "$var" "$value"' 42 ble-measure 'ble/util/set.eval "$var" "$value"' 43 ble-measure 'ble/util/set.read "$var" "$value"' 44 45 # function ble/util/set.eval.2 { 46 # builtin eval "$1=\"\$2\"" 47 # } 48 # function ble/util/set.printf.2 { 49 # builtin printf -v "$1" %s "$2" 50 # } 51 # function ble/util/set.read.2 { 52 # IFS= builtin read -r -d '' "$1" <<<"$2" 53 # } 54 # ble-measure 'ble/util/set.eval.2 "$var" "$value"' 55 # ble-measure 'ble/util/set.printf.2 "$var" "$value"' 56 # ble-measure 'ble/util/set.read.2 "$var" "$value"' 57 fi 58 59 mem=/dev/shm/$UID 60 memtmp=$mem/$$.tmp 61 > $memtmp || (umask 077; mkdir -p "$mem") 62 63 ble-measure 'echo hello > $memtmp && IFS= read -r -d "" result < $memtmp' 64 ble-measure 'echo hello > $$.tmp && IFS= read -r -d "" result < $$.tmp' 65 ble-measure 'result=$(echo hello)' 66 67 ble-measure 'date > $memtmp && IFS= read -r -d "" result < $memtmp' 68 ble-measure 'date > $$.tmp && IFS= read -r -d "" result < $$.tmp' 69 ble-measure 'result=$(date)' 70 71 rm -f "$$.tmp" "$memtmp"