どさにっきキャッシュレス 〜2019年9月上旬〜

by やまや

<< = >>


2019年9月1日(日)

bash の危険な算術式


_  使 bash  zsh  ksh ( kshpdkshmksh)ashdash 

_ 
#!/bin/bash
#『品目,単価,個数』の形式の CSV を読んで、"品目,合計金額" の形式で出力する
csv="foo.csv"
while IFS=, read item price num; do
    echo "$item,$((price*num))"
done < "$csv"

 CSV  $((price*num)) 

_   $ 
$ a=5
$ echo $((a))
5

 POSIX bashzshksh  POSIX 
$ a=5
$ b=a
$ echo $((b))
5

 $ b$b a bash 

_  (indirect expansion)
$ a=5
$ b=a
$ echo ${!b}
5

 $b a${!b}  $a 51
$ a=5
$ b=a
$ c=b
$ echo ${!c} $((c))
a 5

$c b${!c}  $b  "a"  $((c))  $b  $a  5 bashzshksh ()

_ 

_  (hoge.sh)
#!/bin/bash
typeset -i n # 変数nを整数型に宣言(typeset は declare と同じ)
a=5
n="$1"
echo "$a"

1 $n $a  echo 5
$ ./hoge.sh a=10
10

nn="$1" $1 n$1 n $1  "a=10"  $a  $1 read n n=$(hoge) typeset -i (declare -i) 

_   hoge.sh 
$ ./hoge.sh 'x[$(whoami>&2)]'
yamaya
5

whoami   whoami () hoge.sh ** sudo 
$ sudo ./hoge.sh 'x[$(whoami>&2)]'
root
5

whoami  sudo hoge.sh whoami  root  sudo (yamaya)sudo  hoge.sh  root  whoami  root  /etc/sudoers  sudo  hoge.sh sudo  hoge.sh  whoami (sudoers )

_   CSV CSV  $((price*num)) foo.csv 
hoge,100,x[$(whoami>&2)]

使

_  $(( ... ))  typeset -i 
#!/bin/bash
if [[ $1 -eq 0 ]]; then
    a=0
else
    a=1
fi

[[ ... ]]  -eq  -le 使1bash  zsh  [[ ... ]]  [ ... ]  -eq  -le 使 [[  [ 使ksh  [ ... ]  test 使

_  for(( expr1 ; expr2 ; expr3 )) (for i in ... )(${a[x]} x)使 ${var:offset:length}  offset  length 

_  zsh 
% declare -i n
% n='a=10'    # a=10 が実行される
% n=$(echo a=10)   # 実行される
% echo a=10 | read n   # 実行される
% n='x[$(whoami>&2)]'   # whoami は実行されない
% n=$(echo 'x[$(whoami>&2)]')  # 実行されない
% echo 'x[$(whoami >&2)]' | read n # 実行されない
% n='n[$(whoami>&2)]'   # 整数型宣言した変数と配列変数名が一致した場合は実行される

bash 

_  ash  dash 

_  typeset -i 
#!/bin/bash
typeset -i n
a="$1"
[[ $a =~ ^[0-9]*$ ]] && n=$a

 [[ ... ]] 使=~ ()

_   bash 4 IPA  (*1) (*2)

_  IPA  mksh  man  IPA 
Warning: This also affects implicit conversion to integer, for example as done by the let command. Never use unchecked user input, e.g. from the environment, in an arithmetic context!
mksh 使OpenBSD  folk  MirBSD OS /bin/sh 使MirBSD 使

_ 20190905:  ksh (ksh93, pdksh, mksh) [[ ... ]]  [ ... ]  test 使-eq zsh 


(*1):  IPA ( pdksh  public domain )
(*2): IPA  /etc/sudoers IPA 

<< = >>

やまや