初心者にとって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 件のコメント:
コメントを投稿