お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
投稿日:
OS::Linux::コマンド

ifの書き方メモ。中身はtestコマンドなので[[]]の中はtestと同じ書き方が可能。コマンドなので演算子の間とかはスペースが無いとうまく動かない。余談だがzshでwhichすると組み込みコマンドであることが確認できる

which [[
zsh: bad pattern: [[
which [
[: shell built-in command
which test
test: shell built-in command

基本構文

あくまでコマンドなので演算子の間には半角スペースが必要。[より[[の方が高機能らしい

https://fumiyas.github.io/2013/12/15/test.sh-advent-calendar.html
https://yukidarake.hateblo.jp/entry/2015/12/14/205610

if-elif-else

if [[ $var = "条件" ]]; then
    # 処理
elif [[ $var -eq 0 ]]; then
    # 処理
else
    # 処理
fi

and / or

[[]]&&||で区切れば成立する。これらは演算をしているわけではなく[[の終了コードを見て次のコマンドを実行するかどうかを判断しているだけ

if [[ $var1 = "条件1" ]] && [[ $var2 = "条件2" ]]; then
    # 処理
fi

if [[ $var1 = "条件1" ]] || [[ $var2 = "条件2" ]];
    # 処理
fi
動作機序

testコマンドは条件を満たせば0、満たさなければ1を終了コードに設定するため、単純にこれを利用している。[[で代替可能なため基本的にtestは使わない方がいい

# 条件1の$?が0なら条件2が走る
[[ $var1 = "条件1" ]] && [[ $var2 = "条件2" ]]
# 条件1の$?を無視して条件2が走る
[[ $var1 = "条件1" ]] || [[ test $var2 = "条件2" ]]

オプション

文字列用

オプション 意味 補足
string = string 等しい -
string != string 等しくない -
string =~ string 正規表現一致 -
-n string 空文字でない non-zero
-z string 空文字 zero
-d path ディレクトリ directory
-s path ファイルサイズが 0 を超える size

数値用

オプション 意味 補足
0 -eq 0 等しい equals
0 -ne 0 等しくない not equals
0 -lt 0 未満 less than
0 -le 0 以下 less than or equal to
0 -gt 0 超える greater than
0 -ge 0 以上 greater than or equal to

ファイル用

オプション 意味 補足
-d path ディレクトリ directory
-e path 存在するパス exists
-f path ファイル file

参考

投稿日:
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を使った方が楽だが、Dockerなど、入っていない環境では重宝する

オプション

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