初心者にとってZshの特徴は;
- 強力なprintコマンド群(echo, print, printf)。
- 配列変数の記法がスマート。
- 高速な処理速度。
- 結果が見やすい:ボールド体や色付き文字の出力。
他方、初心者でも配列変数を使い込んで来るに連れて、次のような作業がしたくなる;
- 「スカラー変数: scalar variable」から「配列変数: array variable」への変換:
- 下記(3)参照。
- 「echo $scalar | read -A array1」
- 「配列変数: array variable」から「配列変数: array variable」へのコピー:
- 下記(4)参照。
- 「echo $array1 | read -A array2」
- ファンクションの「引数:arguments」に「配列変数:array variable」を渡したくなる:
- 下記(5a,b)参照。
- 関数読み出し:「function "$array1"」
- 関数内部処理:「echo "$1" | read -A array3」
トライ&エラーの結果、「read -A」というコマンドを利用すると、上記の課題が容易に実行できることが判ったので、下記に【A】結果と【B】スクリプトを示します。
【A】スクリプトの動作結果
以下の表示でブロックコート(blockquote)を細切れにしたのは、"Google Chrome"で"translate from Japanese to English"を設定すると、表示が乱れるのを防止する為です。
u1@MmM11[~]% t.arr4a 11:36:14
(1) Scalar variable: $s.
• by command: s='1 2 3'
scalar: $s=»1 2 3«
scalar:${#s}=5
(2) Array variable: $a.
• by command: a='(4 5 6)'
array: $a=»4 5 6«
array:${#a}=3
(3) convert scalar:$s to array:$b.
• by command: echo $s | read -A b
array: ${b}=»1 2 3«
array:${#b}=3
(4) copy array:$a to array:$c.
• by command: echo "$a" | read -A c
array: ${c}=»4 5 6«
array:${#b}=3
(5a) test of function call.
• give array variavle,"$a"to the function;
• by command: test_of_array_input "$a"
Function $0 begin ------------------
test_of_array_input: $1=4 5 6
(5b) convert scalar:$i to array:$d
by command: echo "$i" | read -A d
array: ${d}=»4 5 6«
array:${#d}=3
Function $0 stop ------------------
(6) print each element of arrays by for-loop on $a,$b,$c, and $d.
(2) (3) (4) (5b)
$j $a[$j] $b[$j] $c[$j] $d[$j]
---- ------ ------ ------ ------
1 4 1 4 4
2 5 2 5 5
3 6 3 6 6
(7) copy array:$a to scalar:$t.
by command: t=$a
scalar: ${t}=»4 5 6«
scalar:${#t}=5
u1@MmM11[~]%
【B】スクリプト本体
#!/bin/zsh # t.arr4a: # 2014-12-08 by iritani/mNeji test_of_array_input() { # input as scalar $1 local i=$1 echo ' Function $0 begin ------------------' echo " $0: \$1=$1" echo "$1" | read -A d echo ' (5b) convert scalar:$i to array:$d' echo ' by command: echo "$i" | read -A d' echo ' array: ${d}='»${d}« echo ' array:${#d}='${#d} echo ' Function $0 stop ------------------' } #---------------- main ------------------------ echo '(1) Scalar variable: $s.' echo " • by command: s='1 2 3'" # scalar s='1 2 3' echo ' scalar: $s='»${s}« echo ' scalar:${#s}='${#s} echo echo '(2) Array variable: $a.' echo " • by command: a='(4 5 6)'" # array a=(4 5 6) echo ' array: $a='»${a}« echo ' array:${#a}='${#a} echo echo '(3) convert scalar:$s to array:$b.' echo ' • by command: echo $s | read -A b' echo $s | read -A b echo ' array: ${b}='»${b}« echo ' array:${#b}='${#b} echo echo '(4) copy array:$a to array:$c.' echo ' • by command: echo "$a" | read -A c' echo $a | read -A c echo ' array: ${c}='»${c}« echo ' array:${#b}='${#c} echo echo '(5a) test of function call.' echo ' • give array variavle,"$a"to the function;' echo ' • by command: test_of_array_input "$a"' test_of_array_input "$a" # double-quote necessary for "$a" as function's argument $1 # $a --> the first element only as all arguments passed echo echo '(6) print each element of arrays by for-loop on $a,$b,$c, and $d.' echo ' (2) (3) (4) (5b)' echo ' $j $a[$j] $b[$j] $c[$j] $d[$j]' echo ' ---- ------ ------ ------ ------' for j in {1..3}; do echo " $j $a[$j] $b[$j] $c[$j] $d[$j]" done echo echo '(7) copy array:$a to scalar:$t.' echo ' by command: t=$a' t=$a echo ' scalar: ${t}='»${t}« echo ' scalar:${#t}='${#t} echo # end of script
【感想】
____
このページの履歴
配列変数を引数にする方法は系統的に改良してもらいた。当面は、文句を言う前にスキルの向上が先でしょうね。
素人には、「array4=( $scalar4 )」 といった直感的な記述が使えないのが不思議です。
____
このページの履歴
- 開始 2014-12-08(月) 21:51:06
- 追加 2014-12-09(火) 11:09:11 【感想】「array4=( $scalar4 )」
- 修正 2014-12-15(月) 14:51:46 【A】スクリプトの動作結果 :Chrome対策
0 件のコメント:
コメントを投稿