eval

bash使ってて躓くところに、evalがあると思うのでちょい書き。

つまりこうです。

ume@fifteen:~$ CMD="ls -l | grep test"
ume@fifteen:~$ ls -l | grep test
drwxrwxr-x  3 ume  ume       4096  5月 17  2023 rust-test
drwxrwxr-x  4 ume  ume       4096  1月 28  2025 test
-rw-rw-r--  1 ume  ume       1468 12月 23  2024 test-MAX
-rw-rw-r--  1 ume  ume          0 10月 18  2022 test.flv
-rw-rw-r--  1 ume  ume      19660  1月  8  2025 test.mp4
-rw-rw-r--  1 ume  ume        152  9月 16  2025 test.py
-rw-rw-r--  1 ume  ume          0  1月 30  2025 test.txt
-rw-rw-r--  1 ume  ume          9 12月 26  2024 test1
-rw-r--r--  1 root root       884  6月 14  2019 test101.pkt
-rw-r--r--  1 root root       884  6月 14  2019 test102.pkt
-rw-r--r--  1 root root       454  6月 14  2019 test201.pkt
-rwxr-xr-x  1 ume  ume        257  6月 26  2025 test6.sh
-rw-r--r--  1 ume  ume        554  5月 30  2017 testdhcp01.pkt.gz
-rw-r--r--  1 ume  ume        554 11月  7  2024 testdhcp01.pkt.gzhoge
ume@fifteen:~$
ume@fifteen:~$ ${CMD}
ls: '|' にアクセスできません: そのようなファイルやディレクトリはありません
ls: 'grep' にアクセスできません: そのようなファイルやディレクトリはありません
test:
合計 8
drwxrwxr-x 2 ume ume 4096  9月  8  2020 20200908-ipv6testcpeclient
drwxrwxr-x 3 ume ume 4096  9月 11  2017 mysite
 2 ume@fifteen:~$
ume@fifteen:~$ echo "$(eval ${CMD})"
drwxrwxr-x  3 ume  ume       4096  5月 17  2023 rust-test
drwxrwxr-x  4 ume  ume       4096  1月 28  2025 test
-rw-rw-r--  1 ume  ume       1468 12月 23  2024 test-MAX
-rw-rw-r--  1 ume  ume          0 10月 18  2022 test.flv
-rw-rw-r--  1 ume  ume      19660  1月  8  2025 test.mp4
-rw-rw-r--  1 ume  ume        152  9月 16  2025 test.py
-rw-rw-r--  1 ume  ume          0  1月 30  2025 test.txt
-rw-rw-r--  1 ume  ume          9 12月 26  2024 test1
-rw-r--r--  1 root root       884  6月 14  2019 test101.pkt
-rw-r--r--  1 root root       884  6月 14  2019 test102.pkt
-rw-r--r--  1 root root       454  6月 14  2019 test201.pkt
-rwxr-xr-x  1 ume  ume        257  6月 26  2025 test6.sh
-rw-r--r--  1 ume  ume        554  5月 30  2017 testdhcp01.pkt.gz
-rw-r--r--  1 ume  ume        554 11月  7  2024 testdhcp01.pkt.gzhoge
ume@fifteen:~$
 2 ume@fifteen:~$ $CMD
ls: '|' にアクセスできません: そのようなファイルやディレクトリはありません
ls: 'grep' にアクセスできません: そのようなファイルやディレクトリはありません
test:
合計 8
drwxrwxr-x 2 ume ume 4096  9月  8  2020 20200908-ipv6testcpeclient
drwxrwxr-x 3 ume ume 4096  9月 11  2017 mysite
 2 ume@fifteen:~$
ume@fifteen:~$ ls -l "|" "grep" "test"
ls: '|' にアクセスできません: そのようなファイルやディレクトリはありません
ls: 'grep' にアクセスできません: そのようなファイルやディレクトリはありません
test:
合計 8
drwxrwxr-x 2 ume ume 4096  9月  8  2020 20200908-ipv6testcpeclient
drwxrwxr-x 3 ume ume 4096  9月 11  2017 mysite
 2 ume@fifteen:~$



■

とりあえずラボ内でv6通信させてみてる。んだけど
手持ちのNOKIA機器がfd00::/8とか 2001:db8::/16とかのアドレスを使うと
なぜかめっちゃブロックしてくるので、しょうがないから2001:db7::/16と2001:db6::/16を使ってテストしてる。
外につながってないしこれでいいか・・

C:\>tracert 2001:db7::165

2001:db7::165 へのルートをトレースしています。経由するホップ数は最大 30 です

  1     1 ms    <1 ms    <1 ms  2001:db6:33:fe00:e68e:10ff:feb9:316
  2     2 ms     9 ms     2 ms  2001:db7:1:310::1
  3     1 ms     1 ms     1 ms  2001:db7:0:33::254
  4     1 ms     1 ms     1 ms  2001:db7::165

トレースを完了しました。

C:\>

ZTE F663N + NOKIA 7360 ISAM FX

F663Nがaliexpressで1500円くらいで売ってたから買ってきてみた。
F663Nをブリッジモードにしてならあんまり考えなくても動かせたんだけど、ルーターモードにしても動かすことができたので
以下備忘録です。

まず、F663N側の設定をデフォルトからは少し変更する必要があるようです。
特にWAN側のVLAN-ID
パスワードは192.168.1.1へブラウザでアクセス

user: admin
pass: admin

これでいいのか???っていう設定がデフォルトになってるのね。


さて、あとLAN1にPCを接続するとなぜか動かせないので LAN2に接続してあります。
LAN1が千兆で、LAN2~LAN4が百兆って書いてあるんだけど、千兆のほうが1Gbpsで、残りが10/100ってことなんだろう。2017年のONUだからこのあたりはしょうがない。


一番気になるのが、ONTのslot部分の構成

>#show equipment ont slot | match exact:1/1/5/10/101
1/1/5/10/101/1    1          0           ethernet         C9C7AE8D   enabled
1/1/5/10/101/2    3          0           ethernet         C9C7AE8D   disabled
1/1/5/10/101/3    0          1           pots             C9C7AE8D   disabled
1/1/5/10/101/5    0          0           802_11           C9C7AE8D   disabled
1/1/5/10/101/8    1          0           veip             C9C7AE8D   enabled
>#

ethernet になってるのが1と2で二つ見えていて、電話回線用のpots(日本じゃ使わない)、802_11って802.11ってことなんだから無線のインターフェースなんだろうけど、これがslot扱いで別になってるのね。
で、ルータ部分がおそらく8。NOKIAのONTだとここは14です。


ISAM側の設定はいたってシンプルでいけるんだけど、
configure bridge port 1/1/3/2/30/14/1 vlan-id 881 tag single-tagged l2fwder-vlan 210 vlan-scope local qos-profile name:HSI
なぜかこんな感じのl2fwder-vlanで設定すると動かないみたいなので、しょうがないからユーザーセグメント用のVLANをF663N側の設定でも同じVLANにして
あげるとなぜかつながるん。
こっちの設定ミスですかね? いまいち理由がわからないけど

VLAN関係は

configure bridge port 1/1/5/10/101/8/1 vlan-id 227 tag single-tagged qos-profile name:HSI
configure bridge port 1/1/5/10/101/8/1 default-priority 0
configure bridge port 1/1/5/10/101/8/1 max-unicast-mac 64
configure bridge port 1/1/5/10/101/8/1 pvid 227

こんな感じでたぶんいけるはず。


F663N側のほうがけっこう設定方法に癖があるような気がする。
とくに設定されたのかされたないのかがいまいち判別しにくい。このあたりは多分現行機だともっとまともに動くんでしょうけど。

admin/admin
設定1


ルーティング

たぶんこれくらいだと思う。めっちゃわかりづらい。

HUAWEI HG8120C + NOKIA 7360 ISAM FX

Aliexpressを眺めてたら、HG8120Cが600円で売ってたので買ってきてみました。
なんで日本でこのイーサポートが2つのブリッジ型ONUってほとんど見かけないんでしょうね。
こういうのが主流であってもいいはずなのに。 みんな騙されて4ポートONUとか買わされてない??のかちゃんと考えたほうがいい。


手元にある、NOKIA 7360 ISAM FXにつなげてみたら特に問題なく動くので重要なところだけ抜粋。記憶用。


HG8120Cのファームウェアイメージファイルがネット上で見つけられないので、ソフトウェア指定はなし
あと、シリアル番号をHG8120Cは変えることができるので、NOKIA ONUみたいなシリアル番号に変更してみた


configure equipment ont interface 1/1/5/10/100 sw-ver-pland disabled sernum ALCL:EB0D6D40 fec-up enable enable-aes enable

あと、planned-card-typeのところをethernetする。


configure equipment ont slot 1/1/5/10/100/1 planned-card-type ethernet plndnumdataports 2 plndnumvoiceports 0 admin-state up

多分この二つだけであとは適当設定でも動くと思う。

#show equipment ont interface 1/1/5/10/100 detail
=====================================================================================================================================================================
interface table (detailed)
=====================================================================================================================================================================

---------------------------------------------------------------------------------------------------------------------------------------------------------------------
interface
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
               ont-idx : 1/1/5/10/100              eqpt-ver-num : 393.E                       sw-ver-act : V3R017C10S125               sw-ver-psv : V3R017C10S125
             vendor-id : HWTC                          equip-id : HG8120C                                                        actual-num-slots : 3
        version-number : 393.E                       num-tconts : 8                        num-trf-sched : 2                      num-prio-queues : 64
   auto-sw-planned-ver :                   auto-sw-download-ver :                                 sernum : ALCL:EB0D6D40
          yp-serial-no : unknown
         oper-spec-ver : 1                         act-ont-type : hgu                   act-txpower-ctrl : tx-rx                 sn-bundle-status : idle
      cfgfile1-ver-act :                       cfgfile1-ver-psv :                       cfgfile2-ver-act :                       cfgfile2-ver-psv :
        actual-us-rate : 1.25g                    template-name : DEFAULT                                                        auto-prov-status : not-applicable
=====================================================================================================================================================================
#

あっさり動くね。

>/dev/null 2>&1について

これがわかりにくくなってるのは、2に該当する標準エラー出力とは?というのを説明している人があまりいないことなんじゃないかと思ってるので

$ cd /tmp/
$ ls
cmclist-20260225  
$

例えばこの時に、
"hoge"って単語がcmclist-20260225 内に入ってないとエラーになります。これが標準出力1に該当しています。
grepの場合は、対象ワードが見つけられれば標準出力0、見つけられないと標準出力1となるようになってます。

$ grep "hoge" cmclist-20260225
$ echo $?
1
$


次に、cmclist-20260225じゃなくてcmclist-20260226にgrepしたらどうでしょう?

$ grep "hoge" cmclist-20260226
grep: cmclist-20260226: No such file or directory
$ echo $?
2
$
$ grep "hoge" cmclist-20260226 > /dev/null
grep: cmclist-20260226: No such file or directory
$

これが標準エラー出力2に該当しています。"grep: cmclist-20260226: No such file or directory"っていうメッセージは必ず出力されてしまいますが、 >/dev/nullしてても出力されてしまいます。
これを出力させたくないケースのときに>/dev/null 2>&1を使います。

$ grep "hoge" cmclist-20260226 > /dev/null 2>&1
$ echo $?
2
$

こういうことです。

$ grep "y-super-1" cmclist-20260225
y-super-1.cmc
$ echo $?
0
$

grepでその行を見つけてこれれば見つけた行が返ってきます。これが標準出力0に相当しています。

$ grep "y-super-1" cmclist-20260225 > /dev/null
$ echo $?
0
$

grepの場合は見つけた行は出力されますが、それを出力させたくないときに>/dev/nullに結果を投げます。
これでも0が返ってきますので、cmclist-20260225の中に"y-super-1"が存在していることが分かります。

ちなみに、grepの場合は見つけた場合に出力させないオプションも存在しています。

$ grep -q "y-super-1" cmclist-20260225
$ echo $?
0
$

これでもいいんですけど。さて/dev/nullに投げるのとどっちのほうが挙動が早いんでしょうね???

paizaのB136問題をbashで

paiza.jp

bashは2次元配列ってどうやって作ればいいのかよくわからなかったので、x軸とy軸がこの問題だと100までということになってるので、
arr[1][1]とやりたいところをarr[1001]とするようにしてます。
arr[99][99]だったらarr[99099]ですね
arr[100][1]だったら、arr[100001]です。

力技ですね

#!/bin/bash


read N H W
read SY SX
read SS

for DATA_H in $(seq 1 $H)
do
read -a ARR
for DATA_W in $(seq 1 $W)
do
DATA=$((DATA_W+DATA_H*1000))
CHOCO[$DATA]=${ARR[$((DATA_W-1))]}
done

done


declare -p CHOCO

JIBUN=$((SY*1000+SX))

for MOGE in $(seq 2 $(echo $SS | wc -c))
do
SHIREI=${SS:$((MOGE-2)):1}
if [ $SHIREI == F ]; then
        JIBUN=$((JIBUN - 1000))
        echo ${CHOCO[$JIBUN]}
fi
if [ $SHIREI == B ]; then
        JIBUN=$((JIBUN + 1000))
        echo ${CHOCO[$JIBUN]}
fi
if [ $SHIREI == R ]; then
        JIBUN=$((JIBUN + 1))
        echo ${CHOCO[$JIBUN]}
fi
if [ $SHIREI == L ]; then
        JIBUN=$((JIBUN -1))
        echo ${CHOCO[$JIBUN]}
fi

done

一度read -a arrでチョコの数を入力しつつ、あとでさっきの配列番号ルールに置き換えてコピーしに行っています。
declare -p CHOCO
してるところはデバッグ用です。 何か配列に入ってないと表示されないのですね。何も入ってないところも表示されちゃうのかと思ってました。

下が実行結果サンプルの1つ目のほうだけやっておきます。

ume@fifteen:~/bin$ ./paiza_b136.sh
3 3 3
2 1
FRB
3 6 2
0 4 1
5 0 7
declare -a CHOCO=([1001]="3" [1002]="6" [1003]="2" [2001]="0" [2002]="4" [2003]="1" [3001]="5" [3002]="0" [3003]="7")
3
6
4
ume@fifteen:~/bin$

=============================================================================================================

ume@fifteen:~/bin$ TEST="abcd1234xyz"
ume@fifteen:~/bin$ echo ${TEST:4:1}
1
ume@fifteen:~/bin$ echo ${TEST:6:3}
34x
ume@fifteen:~/bin$ echo ${TEST:0:1}
a
ume@fifteen:~/bin$

こういうのできるのね。こういうのってcut使うのが普通なのかと思ってた

ume@fifteen:~/bin$ echo ${TEST:1:3}
bcd
ume@fifteen:~/bin$ echo ${TEST} | cut -b 2-4
bcd
ume@fifteen:~/bin$

こういう感じです






追記 コメントに書いたら崩れちゃったので、下に書いておく

for (( i=0; i<${#SS}; i++ )); do
    SHIREI=${SS:$i:1}

    if [ "$SHIREI" == "F" ]; then JIBUN=$((JIBUN - 1000)); fi
    if [ "$SHIREI" == "B" ]; then JIBUN=$((JIBUN + 1000)); fi
    if [ "$SHIREI" == "R" ]; then JIBUN=$((JIBUN + 1)); fi
    if [ "$SHIREI" == "L" ]; then JIBUN=$((JIBUN - 1)); fi

    echo "${CHOCO[$JIBUN]}"
done

for文をこんな感じでCっぽく書けるの知りませんでした。

paiza-c166

paizaのスキルチェックでは使えないbashで書いておくのは怒られないでしょ・・・ たぶん

素直に全部ばらして書くとこんな感じだと思う

#!/bin/bash

read X

N=0
while true
do
if [ $((500 * N)) -gt $X ]; then
break
fi
N=$((N+1))
done

N=$((N-1))
X=$((X-500*N))

M=0
while true
do
if [ $((100 * M)) -gt $X ]; then
break
fi
M=$((M+1))
done

M=$((M-1))
X=$((X-100*M))

L=0
while true
do
if [ $((50 * L)) -gt $X ]; then
break
fi
L=$((L+1))
done

L=$((L-1))
X=$((X-50*L))

K=0
while true
do
if [ $((10 * K)) -gt $X ]; then
break
fi
K=$((K+1))
done

K=$((K-1))
X=$((X-10*K))

J=0
while true
do
if [ $((5 * J)) -gt $X ]; then
break
fi
J=$((J+1))
done

J=$((J-1))
X=$((X-5*J))

I=0
while true
do
if [ $((1 * I)) -gt $X ]; then
break
fi
I=$((I+1))
done

I=$((I-1))
X=$((X-1*I))

echo "500en $N mai
100en $M mai
50en $N mai
10en $L mai
5 en $J mai
1 en $I mai
"

echo $((N+M+L+K+J+I))


たとえば、いっぱい出てくる

N=0
while true
do
if [ $((500 * N)) -gt $X ]; then
break
fi
N=$((N+1))
done

N=$((N-1))
X=$((X-500*N))

とかは関数とかでまとめられると思うし、500円100円で分かれてるだけなのでここを変数にしてforにでもしたほうが素直な感じもします。








てか剰余使えってことだろうな・・・

#!/bin/bash

read X

KOUKA="500
100
50
10
5
1
"
for YEN in $(echo $KOUKA)
do
        GOKEI=$((X/YEN+GOKEI))
        echo "$YEN -> $((X/YEN)) mai"
        X=$((X%YEN))
done

echo $GOKEI

たぶんこういう風にするのが正解なんだろうね