Bashで文字列配列を扱う

配列をループして処理したい時に使える技。複数行ある場合も想定

一行文字列の配列

スペースで区切った文字列を()で括っておくとfor inとして使える

取り出した要素は${foo}で拾えます。配列全体は${bar[@]}で取れる。以下のようにダブルクォートで囲っていると機能しなくなるので注意
("AAA BBB CCC")

#!/bin/bash

textList=(YWFhYWEK LWFhYQogICAtIOOBguOBguOBguOBgg== LWFhYQogICAtIOOBguOBguOBguOBgg==)

for text in "${textList[@]}"
do
  echo ${text}
done

出力結果

YWFhYWEK
LWFhYQogICAtIOOBguOBguOBguOBgg==
LWFhYQogICAtIOOBguOBguOBguOBgg==

複数行文字列の配列

Base64辺りでエンコードしておくと扱いが楽

#!/bin/bash

textList=(YWFhYWEK LWFhYQogICAtIOOBguOBguOBguOBgg== LWFhYQogICAtIOOBguOBguOBguOBgg==)

for text in "${textList[@]}"
do
  pure=$(echo ${text} | base64 -d)
  echo "$pure"
done

出力結果

aaaaa
-aaa
   - ああああ
-aaa
   - ああああ

lsの結果を配列にする

#!/bin/bash

# .と..は除外
# 最後にxargsを入れておくと改行が飛ぶ
results=($(ls -1a | grep -vP "^\.+$" | xargs))
for item in "${results[@]}"
do
    echo "$item";
done

スペース区切りの文字を配列にする

IFS変数に区切り文字を設定することで実現する。IFSとはInternal Field Separatorのこと

#!/bin/bash
IFS=$'\n'

text=$(cat <<'EOF'
aa bb
a b c
EOF
)
textList=($(echo "$text"))

for text in "${textList[@]}"
do
  echo "${text}"
done

出力結果

aa bb
a b c

WSL2へのUbuntu 22.04セットアップメモ

環境

Env Ver
Windows 11 Pro Build 22621.674
Ubuntu 22.04.01

ベースのセットアップ

  1. wsl --update
  2. Microsoft StoreからUbuntu 22.04.01 LTSをインストール
    1. GUIのウィザードがコケたらやり直す
  3. /etc/wsl.confに起動設定を追加

    1. リファレンス:learn.microsoft.com
    [boot]
    systemd=true
    
    [user]
    default=<ユーザー名>
    
  4. wsl --shutdown

  5. Ubuntuのコンソールを開きデフォルトユーザーが設定通りなのを確認
  6. アップデート
    sudo apt update
    sudo apt upgrade
    

開発環境のセットアップ

  1. 以下を流す

    sudo apt install -y \
        zsh \
        ssh \
        net-tools \
        git \
        unzip \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    # Docker公式のGPG鍵を追加
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    # リポジトリをパッケージマネージャーに登録
    echo
      "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    # docker本体のインストール
    sudo apt install -y \
        docker-ce \
        docker-ce-cli \
        containerd.io \
        docker-compose-plugin
    # 一般ユーザーで docker を利用可能にする
    sudo usermod -aG docker $USER
    # Node.js
    curl https://get.volta.sh | bash
    # zsh切り替え
    chsh -s $(which zsh)
    
  2. ターミナル再起動

    # zsh設定取り込み
    git clone https://github.com/Lycolia/my-zsh-conf.git
    rm -Rf my-zsh-conf/.git/
    mv my-zsh-conf/.* .
    rm -Rf my-zsh-conf/
    # install Node.js
    volta install node@lts
    
  3. ターミナル再起動してzsh設定の反映を確認

SANGOでWordPressの記事コードブロックが破綻する問題の解決

ログイン時と非ログイン時でコードブロックの改行が変化し、見た目が破綻する問題に気がついたので解決法

問題の事象

ログイン状態だと正常に表示されるが、非ログイン状態だとスーパーリロードなどをすると表示が壊れる

ログイン時 非ログイン時
正常表示 破綻した表示

問題の原因と解決策

非ログイン時にHTML上から改行コードが消えるのが問題でした

解決策としてはダッシュボードからSANGO設定 → 高速化 → HTMLを圧縮してキャッシュするのチェックを外せば解消します

解決したときの設定画面

WSL2のUbuntuのデフォルトユーザーを変更する

ユーザー名を変更したいときに使えるが、ほぼ力技。きっともっと楽な方法があるはず。

確認環境

Env Ver
WSL Distri Ubuntu 20.04.4 LTS

手順

WSL内でユーザーを作る

sudo useradd new_user
sudo cp -R /home/old_user /home/new_user
# 細かい権限はどうにかするかフィルタして旧ユーザーのみ変える
chown -R new_user:new_user new_user/
# 新ユーザーのPWを設定
sudo passwd new_user
# sudo出来るようにする
sudo gpasswd -a new_user sudo

Ubuntuのデフォルトユーザーを変更する

<ディストリ名> config --default-user new_user

WSL2のUbuntuでSSHのパスフレーズを記憶させる

確認環境

Env Ver
Ubuntu 20.04.4 LTS

やり方

これでシェルの起動時に毎回 SSH のパスフレーズを聞かれるようになり、以後入力が不要になる

sudo apt install keychain
cat <<'EOF' | tee -a ~/.zshrc
## Keychain
keychain -q --nogui $HOME/.ssh/<覚えさせる証明書>
source $HOME/.keychain/`hostname`-sh
EOF