2014-12-08

Zsh:「スカラー変数と配列変数の初歩的な処理法」

これまで「os x」でBashスクリプトを使ってきました。最近、中規模のスクリプトを各必要が出てきたので、Zshを使うようになってきた。
初心者にとって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 )」 といった直感的な記述が使えないのが不思議です。

____
このページの履歴
  1. 開始 2014-12-08(月) 21:51:06 
  2. 追加 2014-12-09(火) 11:09:11  【感想】「array4=( $scalar4 )」
  3. 修正 2014-12-15(月) 14:51:46  【A】スクリプトの動作結果  :Chrome対策

0 件のコメント:

コメントを投稿

注目の投稿

Terminalでの、なんちゃってViモドキ

近頃、ようやくKarabiner-Elementsに慣れてきたので、 Terminalで動作する「擬似Vi-Mode」を作って見たので、ご紹介します。 『概要』 「擬似Vi-Mode」の所以は、方向キー「←↓↑→」を通常の「hjkl」ではなくて「jkil」としました。これ...