それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

bash

シェルでファイル名をエスケープにする

シェルスクリプトで、ファイル名をエスケープする シェルスクリプトで、括弧()やスペースなどの文字種をエスケープしたいときに手早い方法がないか。 printf が手軽だった。 printf "%q" 文字列 実際の例ーカッコ 次のようにいい感じにエスケープしてくれ…

bashで入力しやすく見やすいパスワードをサクッと作る(シェルコマンドでハイフン区切りのパスワード生成)

シェルコマンドだけで、覚えやすいパスワードを作りたい iOS のパスワードジェネレーションみたいな、ハイフン区切りのパスワードをサクッと作りたい。 pwgen を入れるとはやい。 sudo apt install pwgen pwgenのパスワードをハイフン区切りにする takuya@$ …

bashで文字列の中身の変数名の値を取り出す(可変変数・間接参照)

bash で配列に入れた文字列を変数として解釈する 変数の文字列を、変数として解釈する。 echo $name=${!name} たとえば変数調べるときに変数名を列挙して中身を全部見るとか。 #!/usr/bin/env bash for i in ip mask subnet subnet interface router ; do ec…

grep の後方参照の代替案 4つ

grep では 後方参照ができないので、代替案を考えることになる。 方法1基本的な方法 -o マッチした箇所だけを取り出す -o を使って、マッチした箇所だけを取り出す。 cat out.txt | \grep -Po 'Abc.*Xyz' 方法2 先読み+あとよみ 先読み・後ろ読みにマッチ…

bashスクリプトで標準入力か引数のどちらかを取得する

STDINか引数を処理するコマンドを作りたい。 たとえば、次のようなコマンドを作りたい。 標準入力があるときは、標準入力を使い、それ以外は引数を使う。 echo AAA | to_lower to_lower AAA to_lower の例。 ヒアストリングに展開すれば楽ちんです。 <<< ${@…

改行を維持して 変数をechoする。

改行を維持して echoする。 改行を保持したまま、変数を出力したい ダブルクォーテーションすることで改行が出る 変数定義 STR=" aaa " 出力例 echo $STR ## 改行が出ない echo "$STR" # 改行がでる 変数をダブルクォーテーションでクォートすると、変数内に…

wget が ipv6 につないでしまう。aliasでIPv4 に限定する

wget が v6アドレスを使ってしまう。 wgetで、v6アドレスを呼びに行ってしまう。NTTの壊れたフレッツ v6 ネットワークで大問題が起きている。 IPoEに早く対応させたほうがいいけど。v6のアドレスをIoT家電が山盛りの家庭内に頒布するのは躊躇われる。 wget …

コマンドが存在するか調査するコマンド、その名もcommand

コマンド存在スルか調査するコマンドに command が使えます。 $ command -v ls ; echo $? alias ls='ls --color=auto' 0 シェルの実行結果は 1/0 で戻されています。 echo $? は直前のシェルの実行結果$? を出力しています。正常終了なら0 異常終了なら $? >…

シェル ( /bin/sh ) での正規表現マッチ。

以前、bash の正規表現について書いた。 今回は、今更だけど、あえて、bash/zsh で使われている [[ を使わずに、正規表現を使おうとしてみた。 expr よりは bash の機能を使ったほうがいい。 以前書いた記事にある。bash/zsh の正規表現を使う方法が個人的に…

空白を含むパス名を含むコマンド文字列をシェル(bash)で処理する

" program files " のような空白を含むパス名を持ったコマンド全体を、変数に保持しててそれを実行したい時 そのままだと動かない。 ## これが実行できない。 cmd='ls ~/Library/Application\ Support/' $cmd 空白を含むパス名を入れたコマンドを文字列とし…

ディレクトリの中のファイルを「時刻」でソートする find と lsをつかって、最新のファイルだけを取り出す。

ls コマンドの場合 ls -t | head -n1 ls コマンドで、時刻順に並べることができるので、これを head と組み合わせれば出来る。 takuya@Gitlab:~$ sudo ls -lt /var/opt/gitlab/backups/ total 92268132 -rw------- 1 git git 43629199360 Apr 25 02:20 15877…

指定したファイルが存在するフォルダを指定する

画像が入ったフォルダを取り出したい。 Nextcloud を触っていて、画像が散らばってしまった。なので、画像大量に入ったフォルダを調べることにする。 となると、どんな方法が良いか思案したが、一番手っ取り早いのは find コマンドだろう find コマンドでjpg…

findコマンドでファイルの所有ユーザーを調べ所有者を間違っているファイルを探す。

find コマンドで、自分以外の所有者のファイルを探す。 ユーザーがtakuya 以外のファイルやディレクトリを探す。 find . -not -user takuya 指定した所有者のファイルを探す。 not を外せば、所有者を限定してファイルを探す。 find . -user takuya オーナー…

指定サイズのファイルを作る方法 ( head 編 )

任意の指定サイズのファイルを作る方法 head を使う場合。 takuya@~$ head -c 100k /dev/urandom > out takuya@~$ ll out -rw-r--r-- 1 takuya staff 100K 2020-03-18 13:59 out ランダム( /dev/urandom) から読み出して、指定サイズを作ります。 head は -c…

GLOBIGNORE で一時的に*(ワイルドカード)のglob 展開を止める。

bash / sh を使ってると glob が邪魔な時がある。 シェルスクリプトを書いていると、 * のワイルドカードの展開がじゃまになるときが多々あります。 その都度エスケープ刷ることが多いと思います。 たとえばワイルドカードを受け取ってあとで展開するような…

find コマンドで シンボリックリンク以外を表示してduする

シンボリックリンクを隠して一覧を取得したい。 実ファイルの du を取ろうとしたときに、シンボリックリンクがじゃまになる。 find -not -type l du を組み合わせて戦う。 du したいときなら ディレクトリと階層を指定する find -type d -not -type l -maxde…

bash で指定回数ループする方法いろいろ for / while など

bash で指定回数ループする方法のあれこれまとめ bash で使える方法です。sh では使えません。 while で10回ループ bash 算術演算のカッコと組み合わせて強いです。 #!/usr/bin/env bash while (( cnt++ < 10 )); do echo $cnt done break も使えます。 br…

シェル(bash)の履歴を指定業だけど消す(間違えてパスワードを履歴に残した)

パスワードを打ち込んでエンターしてしてしまった。 パスワードなど、履歴を残したくない文字列を履歴に残してしまった場合。 たまに、やらかしますよね。複数ウインドウでフォーカスが違ってたとか。 takuya@:~$ 'MyP@$$word' -bash: MyP@$$word: コマンド…

シェルスクリプトで実行中の関数名を関数内部から知る(自分自身の関数名)

自分自身の関数の名前を知りたい。 関数名は、関数名を表す変数に入っている(BASHで確認) echo ${FUNCNAME[0]} これを使うと、自分自身の関数名を実行中に参照できる。 takuya@Desktop$ function sample() { echo ${FUNCNAME[0]} ; }; sample sample 便利…

空白区切り文字列 を xargs で行へ展開-1行→複数行

xargs があるとすぐ出来ます。 xargs -n1 echo 例 空白区切りされた文字列をぱぱっと複数行にする。 xargs と echo を組み合わせると楽。 takuya@~$ echo hello world hello world hello world hello world | xargs -n1 echo hello world hello world hello …

ファイルが作成されてから何秒経っているか?作成後指定秒経過したらなにかする。

ファイルが作成されてから何秒経っているか? このファイルが、作成されてから何秒経過したか。それ知りたいことありませんか? ファイルAがファイルBより古いときはファイルAを更新するとか 作成後(更新後)の経過秒数を知る echo $(( $(date +%s) - $(date…

which コマンドでPATHにある同名のコマンドを全部列挙する

PATH の優先順位に悩まされるたときに which which コマンドを使うと 環境変数 PATH にあるコマンドのうち、最初に見つかったもの(実行されるもの)を表示してくれます。 which python どのコマンドが実行されるのか調べるのに便利ですし、よく使ってると思…

bash で三項演算子っぽく処理を書くには

bash でも三項演算子を使いたい かんたんな、初期値nullチェックとかで三項演算子的なことをよくやります。 bash でもやりたいなと思って調べててみたけど、なかった(あったので追記書きます。)。 条件分岐を使って原始的な手法がsh/bash で使えるのでご紹…

すぐわかる標準エラー出力と標準出力の捨て方( /dev/null へリダイレクト

だれですか ' &1' なんてファイルを作ったのは。 サーバーにログインしてみてたら'1' っていうファイルがあるんですね。1という名前のファイルがあるんですよ。 どう考えても、リダイレクトに失敗してますよね。 標準エラー出力を捨てる速攻で覚えるの書き…

bashのループと数字比較を組み合わせでVPNを接続開始して接続待ち、接続後に処理をする。

bash のサンプルプログラムを考えてた。 よくあるパターンとして、 〇〇を実行して〇〇が△△になるのをまってから、□□する を考えてみた。 VPN の接続を待機する 今回のサンプルはMacでVPNを接続し、接続待ちをし、VPN接続が完了したらルーティングを加える。…

bash の* ( アスタリスクのワイルドカード)でドットファイル(隠しファイル)を一時的にマッチさせる

TL;DR shopt -s dotglob shopt -u dotglob ドットファイルも含めたい時がある。 for i in $ (ls -a) はめんどくさいんだよなぁ ホームディレクトリで、*でワイルドカードマッチさせても一致しないのが不便。 ls -al しているときは気にならないのだけど、一…

$(pyenv init -) が遅いので遅延ロードにした

ターミナルの起動が遅い。 最近、妙にターミナルの起動が遅くて苦痛だなと思って調べたら pyenv 関連だった。 rbenv もそうだったし、pyenv もやはり遅い。 rbenv に関してはrbenv init では諦めて、symlink を使って解決しているが pyenv は別の方法を模索…

ip コマンドは -o オプションを使うと便利すぎてやばい

ip コマンド は -o オプションをつけるとメッチャ見やすい ip コマンドの ip a の結果はごちゃって見辛くないですか?私は非常に辛い。 とくにIPv6 が混じってきて、1つのインターフェースに複数のIPが入ってくると辛い シェルスクリプトで、grep してるけ…

bash で mac かどうかを判定する

mac かどうかをbash のif文の条件判定する [[ $(uname) =~ Darwin ]]; echo $? ## または [[ $(uname -a ) =~ Mac ]]; echo $? bash の正規表現ってホント便利 正規表現を使わない場合 bash 以外と bash 3.2 未満は正規表現が使えないので、glob でマッチす…

xargs でシェルのalias を使えるようにする方法。

xargs で alias が使えない takuya@:教科書$ find -type d -maxdepth 1 | xargs ll xargs: ll: そのようなファイルやディレクトリはありません 悲しい。Aliasはあくまで bashのエイリアスであり、シェル経由せずにfork するような場合には全く役に立たない。…