お知らせ

現在サイトのリニューアル作業中のため、表示が崩れているページが存在することがあります。
投稿日:OS::Linux::コマンドソフトウェア::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
投稿日:OS::Linux::コマンド

unified形式のパッチファイルの当て方
git diff -u > diff.patchとかしたやつを当てることを想定している

サンプルコード

patch -p1 < diff.patch

解説

  • -p<n><n>はpatchファイルのパス階層をストリップする役割を持っている
  • diffファイルに記載されているファイルパスは以下の形式のためa/, b/が除去されてパッチが当たる仕組み
--- a/path/to/file
+++ b/path/to/file
投稿日:OS::Linux::コマンド

置換をするためのコマンドだが、PCREは基本使えない(自前でビルドすれば使える)

大抵のケースでPerlを使った方が楽だが、Busybox系のディストリなどで入っていない環境では重宝する。

オプション

  • -l入力からケツ改行を消す
    CLI入力するとケツに改行が入るのでそれを除去できる
  • -p入力行を処理する
  • -eスクリプトを流せるphp -rのようなもの
  • -i[ext]ファイル置換。extに指定があるとバックアップファイルが生える
    • sed -i.bak -e 's/aaa/bbb/' path/to/file

チートシート

改行を改行コードに変換

コマンドを使う必要がある

入力

cat <<'EOF' | sed ':a;N;$!ba;s/\n/\\n/g'
aaa
bbb
ccc
ddd
EOF

出力

aaa\nbbb\nccc\nddd

コマンドの意味合い

コマンド 意味合い
; 恐らくコマンドの終わり
: ラベル。今回の:aはラベルa
N 入力の次の行をパターンスペースに読み込む
$ 最終行にマッチ
! マッチしない(アドレスとコマンドの間に入れる必要がある)
b ラベルに分岐する。baはラベルaに分岐。gotoみたいなもんだと思う

つまり入力の次の行をパターンスペースに読み込み、最終行にマッチしなければ入力の次の行をパターンスペースに読み込み、マッチすればs/\n/\\n/gが発動するのだと思われる。

投稿日:OS::Linux::コマンド

おなじみのアーカイブ作成コマンド。迷ったらヘルプ読んだほうが早い

圧縮編

基本

  • tar -zvcf foo.tar.gz foo
z: --gzip, gzip
v: --verbose, 詳細、別になくてもいい
c: --create, アーカイブの新規作成
f: --file, 保存するファイル名

tar -cfだとtarballになると思われる

おまけ

T: --files-from, アーカイブ対象ファイルのリストを読み込む。LF区切りのテキスト
--exclude: <pattern>, アーカイブから除外するパスのパターン

展開編

  • tar -zxvf foo.tar.gz foo
z: --gzip, gzip
x: --extract, 展開
v: --verbose, 詳細、別になくてもいい
f: --file, 展開するファイル名