IPAM や DHCP サーバーを実装するとき、IP アドレスを機械的に生成するために、IP アドレスの計算をする事があります。 例えば IPAM がラックやデータセンターから機械的に IP アドレスを割り当てたり、DHCP サーバーが連番の IP アドレスを割り当てたりします。 この記事ではシェルスクリプトで IP アドレスを計算する方法を紹介します。 IP アドレスと数値の変換 IP アドレスを計算する上で欠かせない操作が、IP アドレスと数値の相互変換です。 IPv4 アドレスは長さ 4 のバイト列に過ぎませんが、通常は192.168.0.1 のように人間の扱いやすい文字列で表現します。 一方 IP アドレスを計算するには、IP アドレスをバイト列や 32 ビット数値などの、計算機で扱いやすい形に変換します。 IP アドレスを数値として扱えると、数値演算で IP アドレスを計算したり
tl;dr man bash 例 若干の Kubernetes クラスタを選択したい Kubernetes Pod を選択したい 以上 tl;dr ホントにちょっとした運用ツールを bash で作っていて, 複数の選択肢をリストアップしてメニューとして選択出来るようにしたいなーと思っていたら, bash には select 文という超絶便利な構文が用意されていたので使ってみました. man bash https://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html より引用させて頂きつつ, 重要だなと思ったところをかいつまんで. select name [ in word ] ; do list ; done in に続く単語のリストが展開され、要素のリストが生成されます。 展開された単語の集合が番号付きで標準エラー出力に出力されます。 「in
私の場合、xargsの引数がオーバーする程のファイルを扱う時は、少し怖いので一度別のディレクトリに移動してから削除するなりをやってます。 また、数十個の場合ならばfindだけでやってしまいますね。その方が思考が止まらないし...。 ただ、findとxargsの組み合わせで結構多いのが さらにその中から間引きたい 実行は並び替えた結果で行いたい といった場合が少なからずあるのです。 例えばYYYYMMDD等といった日付形式のファイル名で散乱しているファイルを日付通りに処理したい。 と言った場合、やはりsortやgrepのお世話になるのが楽ですよね。 sortやgrepを使う場合、findで-print0した結果ではフィルタフィルタ実行する事が出来ません。 こんな場合には、findでは-print0せずに find . -name "*.txt" | grep '/[0-9]¥{8¥}¥.tx
以下、それぞれについて実際の実行例を記載しておく。 ${#変数} : 変数の文字数を取得する [root@BS-PUB-CENT7-01 ~]# TEST1=1234567890 [root@BS-PUB-CENT7-01 ~]# TEST2=ABCDEFGABVDEFG [root@BS-PUB-CENT7-01 ~]# echo $TEST1 1234567890 [root@BS-PUB-CENT7-01 ~]# echo $TEST2 ABCDEFGABVDEFG [root@BS-PUB-CENT7-01 ~]# echo ${#TEST1} 10 [root@BS-PUB-CENT7-01 ~]# echo ${#TEST2} 14 ${変数:-文字列} : 変数がNULLの場合、指定した文字列を返す [root@BS-PUB-CENT7-01 ~]# echo $NULLTE
Bash でコマンドの実行結果、またはファイルの中身を一行ずつ読み込むためには、read コマンドを使います。 具体的には、while ループを回しながら、read によって読み込まれたデータを、一行ずつ line という変数に格納する形になります。 コマンドの実行結果、またはファイルの中身が最終行まで完全に読み込まれた時点でループから抜けることになります。 というわけで、while read line セットで覚えると良くて、while read line をより効率的に使うために、Here Document (ヒアドキュメント) と一緒に使うことが多いです。 Unix 系、Linux 系、OSX、BSD 等、シェルが使える環境上でスクリプト書くときにパターン化していつでも参考にして状況に応じて使えるようにまとめてみました。
execコマンドはbashの組み込みコマンドでシェルを実行するコマンドで置き換えるコマンドになります。例えば、シェルスクリプト等で、あるコマンドを実行する場合、プロセス上では、実行したいコマンドが終わるまでそのコマンドを実行するシェルスクリプトのプロセスが残ることになります。実行できるプロセス数には限界があり、execコマンドで実行すると無駄にプロセスが実行することを防げます。 また、execコマンドを引数にコマンドなしで利用するとシェルのリダイレクトの設定を変更することもできます。 プロセスを置き換える あるコマンドを実行させたいときに、シェルスクリプトを実行してコマンドを実行させる場合、プロセス上ではコマンドを実行させるために起動したシェルスクリプトのプロセスがそのコマンドが終了するまで残ります。例えば、sleepコマンドを起動させるシェルスクリプト実行させて、その後、すぐに実行を中断
Redmine¶ RedmineAlbum plugin開発RawHtml plugin開発追加導入したプラグインGoogle Analytics PlugIn BASH Syntax Highlighting(bashのシンタックスハイライトを追加)手順参考 PageMapの追加前提Setuppagemapのダウンロードと配置CSSの追加JavaScriptの追加 役に立ちそうなプラグインメモ Album plugin開発¶ Redmine Album pluginを参照 RawHtml plugin開発¶ Redmine RawHtml pluginを参照 追加導入したプラグイン¶ Google Analytics PlugIn¶ Google Analytics PlugIn http://www.redmine.org/plugins/google_analytics_plugin
#!/bin/sh while getopts l:a: OPT do case $OPT in "l" ) echo "$OPTARG";; "a" ) echo "$OPTARG";; esac done getopts l:a: の部分がオプションの指定。 :(コロン)をつけることで、引数があることを明示。 引数があることを明示した場合、$OPTARGでその引数を取得することができる。 $ ./test.sh -l hoge -a fuga ↓ $ hoge $ fuga と出力される。 参考: http://tech.lampetty.net/tech/index.php/archives/373
ヒアドキュメントはシェルスクリプトの中にちょっとした別のスクリプトを埋め込むときに便利です。 数行のスクリプトのためにわざわざファイルを作る必要がなくなり、見通しがよくなります。 # ちょっとしたスクリプトを動かすのに便利 # 例) oracleDBのテーブル一覧を出力する sqlplus -S user/pass@sid << EOS set pagesize 0 set feedback off select table_name from tabs order by table_name; EOS 要点 ヒアドキュメントを理解するうえで重要なのは、ヒアドキュメントは標準入力として扱われる、ということです。 文字列リテラルでないことに注意してください。 これを把握していれば、最初の例でcatにヒアドキュメントを渡していた理由がわかるかと思います。 catはファイルを省略した場合に標準入
最初に質問に答えると次のようになります。 $(cd $(dirname $0) && pwd) ... 実行中のスクリプトがあるディレクトリの絶対パス (/ で始まるパス) 文字列 $(cd $(dirname $0)/.. && pwd) ... 実行中のスクリプトがあるディレクトリの親ディレクトリの絶対パス文字列 ここで使われているシェル変数やコマンド、構文の意味は次のとおりです。 $0 は実行中のスクリプトのパス (bash や sh に渡された引数そのもの) を表します。 dirname は引数で与えたパス文字列のディレクトリ部分を返すコマンドです。 pwd はカレントディレクトリを絶対パスで返すコマンドです。 $( ... ) はシェルで ... を実行した結果 (標準出力) の文字列に置き換えられます。 一般に $(cd DIR && pwd) は、ディレクトリ DIR (相対
■ bash の危険な算術式 _ 使ってる人がいちばん多いだろうからタイトルでは bash としてるけど、ここで取り上げることは zsh および ksh 一族(本家 ksh、pdksh、mksh)にも該当する。ash、dash などでは該当しない。 _ 以下のシェルスクリプトには脆弱性がある。わかるだろうか。 #!/bin/bash # "品目,単価,個数" の形式の CSV を読んで、"品目,合計金額" の形式で出力する csv="foo.csv" while IFS=, read item price num; do echo "$item,$((price*num))" done < "$csv" これ、細工された CSV ファイルを食わせることで、任意コードの実行ができてしまう。数ある脆弱性の中でもとくにヤバいやつだ。どこが穴なのかというと、タイトルにもあるとおり算術式なのだが、し
動機 findで.DS_Storeが引っかかるのウザすぎ!!! 無視リストをどっかから引っ張ってきたい ~/.gitignoreでよくね? 方法 下記記事がそのものズバリだった。 linux - Exclude list of files from find - Stack Overflow # .DS_Storeや*.swpが出力される $ find . -maxdepth 1 -mindepth 1 -type f ./.blanc.scpt.swp ./.DS_Store ./hoge.txt $ cat ~/.gitignore .gitignore .DS_Store *.swp *.bak .watsonrc # 展開後のコマンド: # find . -maxdepth 1 -mindepth 1 ! -name .gitignore ! -name .DS_Store ! -
追記: コメント欄にて、若干変なパスが含まれている場合の対処方法について、補足いただきました。 ご指摘ありがとございますm(_ _)m bash / zshなどでシェルスクリプトを書いていると、環境変数の設定を外部ファイルにまとめてsource して使う、というのはよくある。 そのような場合にsourceされたファイル内での絶対パスがイマイチうまく取れない、という問題に突き当たる事がある。 bashの話: うまくいかない方法と理由 通常、シェルスクリプト内で自分自身の絶対パスをとるときによくやるのが下記の手法だとおもう。 が、単体で呼び出した場合にはちゃんと動くのだが、bashからsourceで呼び出した場合にはうまく動かない。 なぜかというと、sourceされたファイルの実行が、呼び出し元のシェルプロセス内になるから。 bashでは$0は実行コンテキストに依らず、実行ファイル名が入ってい
[FAQ CENTER トップ] [redhat linux 技術ドキュメント トップ] linuxにおける bash 設定ファイル読み込みの順番 Redhat EL 6.2の場合 環境:RHEL 6.2 (run level 3) # cat /etc/redhat-release Red Hat Enterprise Linux Server release 6.2 (Santiago) # grep :initdefault: /etc/inittab id:3:initdefault: 以下に色々なログオンによる各bashファイルの読み込み順番についてまとめました。表内の数字は読み込まれる順番を表します。×は読み込まれない事を表します。~(チルダ)はユーザのホームディレクトリを表します。user01なら/home/user01です。
こんにちは、hachi8833です。社内Slackで見かけたmorimorihogeさんの以下の書き込みで目から鱗が落ちました。 ~/.bashrcで何かを出力してしまうと、rsyncなどのsshパイプで問題が生じることがあるそうです。 参考: 知らないとrsyncでもハマるシェル初期化 - Qiita これをきっかけに、できるかぎり一次情報を元になるべく一般的になるようにまとめてみました。 シェルスクリプト(.bashrcや.bash_profileなども含む)はあまりに自由に書けてしまい、LinuxディストリビューションやmacOSによって作法がまちまちだったりするので、外してはいけないポイントがどこかを知りたかったのでした。 対象はbashとsh(Bourne Shell)に限定します。また、デスクトップGUIの設定ファイルについては最小限にとどめます。 bashのmanページ 元記
例えば,ディレクトリ /tmp/hoge に print.ps というファイルが作成されたら,それを自動的に印刷するようにしたい場合,ファイル作成イベントを監視する必要がある. inotifywait というコマンドを使えばそれが簡単にできるので,紹介する. 次のbashスクリプトは, /pstmp というディレクトリにファイルが作成されたら,そのファイルを別ユーザアカウントで kghostview で開く,というものだ*1. #!/bin/bash # required package: inotify-tools psout_dir=/pstmp m_account=aki-yam events=(-e CREATE -e MODIFY -e MOVED_TO) while inotifywait ${events[@]} $psout_dir; do psfile=$psout_di
ヒストリ履歴からよく使ってるものをお焚き上げする。 注意点: npm 周り、グローバルコマンドは npm i -g で入れてて、ローカルで扱うものは yarn で使うという癖がある 追記: シェルじゃなくてCLIだろと言われるのが多かったので訂正した vscode $ code . -r 現在ディレクトリを VScode で開く。 -r が肝で、新しいウィンドウを生成せず、既存のウィンドウを開き直す。 yarn $ yarn install --prefer-offline yarn install 時にローカルキャッシュを優先する。テザリング環境下でリポジトリを作成するのに便利。 フリーランスになってから出先で作業することが多く、ギガ足りない問題が多々発生した。 git $ git clone <github-url> --depth 1 HEAD だけ clone する。テザリング環境
シェルスクリプトで set -e (errexit) しておくと、スクリプト中に実行したコマンドの終了ステータスが「非0」だった場合、つまりコマンドが失敗したときにそこでスクリプトを中断してくれるようになります。(終了ステータスとは「Exit code」「Return status」などと呼ばれるものです。) 都度エラー判定を書かなくてもよくなるので便利なオプションですが、個別にエラーハンドリングをしたくなった時にも意図せずスクリプトが中断されてしまい困ったことになります。 例えば、以下の例は false コマンドの実行で失敗扱いとなり、そこでスクリプトが中断されるため「finish」が出力されることはありません。 set -e # false コマンドは必ず終了ステータスに 1 (失敗) を返すコマンド # エラーが起きたとみなされスクリプトは中断される false # このコマンドは実
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く