お知らせ

現在サイトのリニューアル作業中のため、全体的にページの表示が乱れています。
投稿日:
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::コマンドソフトウェア::Bash

シェルスクリプトが設置されているパスを取得する

  • cwd=$(cd $(dirname $0); pwd)
    • $0はシェルスクリプトのフルパス
    • dirnameでスラッシュから始まるファイル名を除去
    • cdで移動
    • pwdで表示

現在のパスを移動せずにシェルスクリプト内でパスを移動する

これはサブシェルを使うと出来る
サブシェルとは()で囲まれた部分で、この中では別のシェルが動いている
例えば次のスクリプトはfoo/に移動し中のファイルリストを表示するが、2行目では現在の位置にあるファイルリストを表示するため移動していない
コマンド展開記法$()もサブシェルが動いている

(cd foo/; ls -la)
ls -la

複数コマンドをワンライナーで実行する

;

  • 以下のように書くと連続で線形実行される。手前が異常終了しても続く
    • curl; echo 2;

&

コマンドの末尾に&をつけるとバックグラウンドで実行される

  • 以下の例では左がバックグラウンド、右がフォアグラウンドで実行される
    • echo 1 & echo 2

&&

AndAlso的な動きをする

  • 以下のように書くと連続で線形実行される。手前が異常終了すると続かない
    • curl && echo 2

|

コマンドの末尾に|をつけると標準出力が次にリダイレクトされる

  • 以下のように書くと連続で線形実行される。手前の標準出力が次にリダイレクトされる
    • echo 1 | xargs -I{} echo {}2

||

OrElse的な動きをする

  • 以下のように書くと連続で線形実行される。手前が異常終了した場合のみ次が動く
    • curl || echo 1