【ShellScript】シェルスクリプトの逆引き集

シェルスクリプトの逆引き集

基本的な実装は習得済みだが、時々目にしたことが無い処理方法や便利なコマンドに出会すのでそれらを記録に残しておく。
スクリプトの場合は、対象のシェル種別をシバン(1行目の #! )に記載している。
 

 

現在のマウント状態を取得する

参考元
Software Design 2018年7月号
util-linux パッケージに含まれる findmnt コマンドを使う。
「-n」を付与すると1行目のヘッダを表示しなくなる。
df コマンドとの違いはファイル使用量を表示しない点らしい。

$ findmnt 
TARGET                                SOURCE     FSTYPE       OPTIONS
/                                     /dev/mapper/rhel-root
                                                 xfs          rw,relatime,seclabel,attr2,inode64,noquota
├─/sys                                sysfs      sysfs        rw,nosuid,nodev,noexec,relatime,seclabel
│ ├─/sys/kernel/security              securityfs securityfs   rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/cgroup                    tmpfs      tmpfs        ro,nosuid,nodev,noexec,seclabel,mode=755
│ │ ├─/sys/fs/cgroup/systemd          cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/us
│ │ ├─/sys/fs/cgroup/pids             cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,pids
│ │ ├─/sys/fs/cgroup/cpuset           cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,cpuset
│ │ ├─/sys/fs/cgroup/net_cls,net_prio cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls
│ │ ├─/sys/fs/cgroup/cpu,cpuacct      cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu
│ │ ├─/sys/fs/cgroup/devices          cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,devices
│ │ ├─/sys/fs/cgroup/freezer          cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,freezer
│ │ ├─/sys/fs/cgroup/memory           cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,memory
│ │ ├─/sys/fs/cgroup/hugetlb          cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb
│ │ ├─/sys/fs/cgroup/perf_event       cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,perf_event
│ │ └─/sys/fs/cgroup/blkio            cgroup     cgroup       rw,nosuid,nodev,noexec,relatime,seclabel,blkio
│ ├─/sys/fs/pstore                    pstore     pstore       rw,nosuid,nodev,noexec,relatime
│ ├─/sys/fs/selinux                   selinuxfs  selinuxfs    rw,relatime
│ ├─/sys/kernel/debug                 debugfs    debugfs      rw,relatime
│ ├─/sys/kernel/config                configfs   configfs     rw,relatime
│ └─/sys/fs/fuse/connections          fusectl    fusectl      rw,relatime
├─/proc                               proc       proc         rw,nosuid,nodev,noexec,relatime
│ └─/proc/sys/fs/binfmt_misc          systemd-1  autofs       rw,relatime,fd=22,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,
├─/dev                                devtmpfs   devtmpfs     rw,nosuid,seclabel,size=6776596k,nr_inodes=1694149,mode=755
│ ├─/dev/shm                          tmpfs      tmpfs        rw,nosuid,nodev,seclabel
│ ├─/dev/pts                          devpts     devpts       rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000
│ ├─/dev/hugepages                    hugetlbfs  hugetlbfs    rw,relatime,seclabel
│ └─/dev/mqueue                       mqueue     mqueue       rw,relatime,seclabel
├─/run                                tmpfs      tmpfs        rw,nosuid,nodev,seclabel,mode=755
│ ├─/run/user/42                      tmpfs      tmpfs        rw,nosuid,nodev,relatime,seclabel,size=1358748k,mode=700,uid=42,
│ ├─/run/user/1000                    tmpfs      tmpfs        rw,nosuid,nodev,relatime,seclabel,size=1358748k,mode=700,uid=100
│ │ └─/run/user/1000/gvfs             gvfsd-fuse fuse.gvfsd-f rw,nosuid,nodev,relatime,user_id=1000,group_id=1000
│ └─/run/media/neko/RHEL-7.5 Server.x86_64
                                      /dev/sr0   iso9660      ro,nosuid,nodev,relatime,uid=1000,gid=1000,iocharset=utf8,mode=0
├─/boot                               /dev/sda1  xfs          rw,relatime,seclabel,attr2,inode64,noquota
└─/var/lib/nfs/rpc_pipefs             sunrpc     rpc_pipefs   rw,relatime

 

2つのファイルの一致する行を抽出する

参考元
2つのファイルの共通行を抽出する方法

a.txt と b.txt を比較して、両ファイルに存在する行を抽出する。(大文字、小文字は区別する)

% grep -x -f a.txt b.txt

なお、comm コマンドはa .txt と b.txt を事前にソートしておく必要があり使い難い。
ソートをせずに比較する comm --nocheck-order -12 a.txt b.txt としても 、抽出漏れを起こしてしまう。
 

複数行をコメント化する

何も出力しないコマンド : に対してヒアドキュメントを与えるとコメント化できる。
参考元
Software Design 2018年7月号

#!/bin/bash -x

: << '#COMMENT'
echo a
echo b
echo c
#COMMENT

 

-x オプションでデバッグログ出力を切り替える

次のように set -x を定義する (あるいはシバンにて /bin/bash -x とする)と, 「This is a comment line」を表示してくれる。
参考元
Software Design 2018年7月号

#!/bin/bash
set -x 
: This is a comment line.

 

拡張子のみの取得方法

Ubuntu 18.04 の /bin/sh = /bin/dash で動作確認済み。
以下のスクリプトを実行すると、結果は「fish」となる。

#!/bin/sh
b=/home/neko/.config/fish/init.fish
ext=`echo ${b##*.}`

 

参考にしたサイト
ファイルパスからファイル名や拡張子を自由に取り出す - ザリガニが見ていた...。
 

補足

${変数#パターン}	先頭から最短一致した部分を取り除く
${変数##パターン}	先頭から最長一致した部分を取り除く
${変数%パターン}	末尾から最短一致した部分を取り除く
${変数%%パターン}	末尾から最長一致した部分を取り除く
ファイルパスからファイル名や拡張子を自由に取り出す - ザリガニが見ていた...。

 
 

basenameコマンドによる拡張子削除方法

参考にしたサイト
ファイルパスからファイル名や拡張子を自由に取り出す - ザリガニが見ていた...。

通常の basename の使い方。

% basename /home/neko/.config/fish/config.fish 
config.fish

 
basename に第2引数を与えてやると、拡張子部分を削除する

% basename /home/neko/.config/fish/config.fish .fish
config


man basename をしてみると以下のようにあった。
「-s」を付けて拡張子を削除してやる方がわかりやすいのかも知れない。

Usage: basename NAME [SUFFIX]
  or:  basename OPTION... NAME...
NAME から前にある全てのディレクトリ部分を取りのぞいた名前を表示します。
指定があれば、末尾の SUFFIX も取り除きます。

Mandatory arguments to long options are mandatory for short options too.
  -a, --multiple       複数の NAME 引数をサポートし、各 NAME に処理を行う
  -s, --suffix=SUFFIX  接尾辞 SUFFIX を削除する。暗黙的に -a が使用される
  -z, --zero           各出力を改行ではなく NUL で区切る
      --help     この使い方を表示して終了する
      --version  バージョン情報を表示して終了する

例:
  basename /usr/bin/sort          -> "sort"
  basename include/stdio.h .h     -> "stdio"
  basename -s .h include/stdio.h  -> "stdio"
  basename -a any/str1 any/str2   -> "str1" followed by "str2"

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
basename の翻訳に関するバグは <http://translationproject.org/team/ja.html> に連絡してください。
Full documentation at: <http://www.gnu.org/software/coreutils/basename>
or available locally via: info '(coreutils) basename invocation'