タグ

シェルスクリプトに関するatm_09_tdのブックマーク (75)

  • Bash Scriptの作法 - Qiita

    はじめに チーム開発でシェルスクリプト(特にBash Script)を書く際に守るべきルールをまとめます。 シェルスクリプトのコードレビューをする際等にお役立てください。 スクリプト名 -区切りの小文字英数字(いわゆるkebab-case)をつける。拡張子は.sh. これは特に理由があるわけではないので_区切りでもよいし、チーム内にzshやfish等の他Shell愛好家がいる場合は拡張子は.bashでも良い。どちらにせよチーム内では統一しておかないと混乱の元となる。 改行コード LFを使用する。CRLFだと動作しないので書く際に間違うことはないが、Windows上のgitのautocrlf設定によってはご丁寧にCRLFでチェックアウトされてしまう。 避けるためにはgit config --global core.autocrlf inputとするか、.gitattributesをレポジトリ

    Bash Scriptの作法 - Qiita
  • シェルスクリプトを書くのをやめる - blog.8-p.info

    今年から、できるだけシェルスクリプトを書くのをやめようとしている。私が毎日 zsh に打ち込んでいるのも広義のシェルスクリプトだし、自分用の雑なスクリプトを書くことはあるけれど、チームの他の人も将来に使ったり改変したりするようなものは、なるだけ他の言語を使っている。 シェルスクリプトを書くのは難しいし、その難しさは、学ぶに値しないといったら言い過ぎかもしれないけれど、2021年に初心者が取り組むべき問題とは言い難いと思う。 シェルは悪いプログラミング言語である Bash Strict Mode とかを使ってみても、シェルスクリプトには落とし穴が多すぎる。自分で書いたものを自分で使っている分には大丈夫なのだけど、スクリプトがチーム内で使われるようになると、考慮していなかったところ、例えばファイル名に空白文字が含まれるとか、そういうレベルの微妙なところで、ちゃんと書かれていないスクリプトは壊れ

  • POSIX 準拠のシェルスクリプトでは find | xargs よりも find -exec {} + を使うべき! - Qiita

    POSIX 準拠のシェルスクリプトでは find | xargs よりも find -exec {} + を使うべき!ShellScriptBashshellPOSIX はじめに find の出力を xargs にパイプで渡すというのはよく見かける使い方ですが、find -print0 | xargs -0 が使えない POSIX 準拠のシェルスクリプトでは find -exec {} + を使った方が良いです。安全かつ十分に速いからです。よく見かける -exec {} ; ではなく -exec {} + ですので間違えないようにしてください。多くのケースでは + の方が優れているのですが ; ばっかり使われているのを見ると、意外と知られてない気がします。 少しだけ予備知識として、-exec {} ; は -exec {} \; と ; をバックスラッシュでエスケープするのがよく見る使い方

    POSIX 準拠のシェルスクリプトでは find | xargs よりも find -exec {} + を使うべき! - Qiita
  • [小ネタ] 続・シェルスクリプトで日付 ⇔ UNIXTIME 相互変換の計算がしたい(BSD date, Ruby, jq) | DevelopersIO

    [小ネタ] 続・シェルスクリプトで日付 ⇔ UNIXTIME 相互変換の計算がしたい(BSD date, Ruby, jq) 3年ほど前に書いたやり方のアップデートです。シェルスクリプトの中で、日付の計算をしたりタイムスタンプを出力したりという需要は現在でもそこそこある(著者調べ)ということで、今回は BSD date(macOS標準の date コマンド)と Ruby、 jq について紹介します 以前、こんな記事を書きました。 このときはこれで解決したのですが、3年ほど経ってまた同じ需要が出てきました。 そこで「もう少し楽な方法ないかな?」と調べてみたら普通に見つかったので、備忘録がてらご紹介します。 シェルスクリプトで日付の計算がしたい (BSD date) 前回のブログで「macOS標準のdateコマンド(BSD date)ではできないので〜〜」とか書いていたんですができました。 ぼ

    [小ネタ] 続・シェルスクリプトで日付 ⇔ UNIXTIME 相互変換の計算がしたい(BSD date, Ruby, jq) | DevelopersIO
  • shellnium - ShellスクリプトでWebブラウザを自動操作

    Seleniumを使うとWebブラウザをプログラミングコードから自動操作できます。よくWebブラウザのテストなどで使われていますが、スクレイピングや業務システムの自動操作でも利用されます。 今回紹介するshellniumは、そんなSeleniumをシェルスクリプトで操作するソフトウェアです。 shellniumの使い方 実際のコードです。 #!/usr/bin/env bash source ./selenium.sh main() { # Googleのトップページに遷移 navigate_to 'https://google.co.jp' # 検索ボックスの要素を取得 local searchBox=$(find_element 'name' 'q') # 検索ボックスに入力&検索実行 send_keys $searchBox "タピオカ\n" } main ちゃんとWebブラウザを自

    shellnium - ShellスクリプトでWebブラウザを自動操作
  • bash の危険な算術式 - どさにっき

    ■ 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 ファイルをわせることで、任意コードの実行ができてしまう。数ある脆弱性の中でもとくにヤバいやつだ。どこが穴なのかというと、タイトルにもあるとおり算術式なのだが、し

  • bashスクリプティング研修の資料を公開します - エムスリーテックブログ

    こんにちは、エンジニアリングGの中村です。 以前にこのブログにてエムスリーでの社内研修について紹介しました。今回は、この中でのbashスクリプティング講座の資料を公開します。 www.m3tech.blog 弊社の中でもいろいろな用途でbashが使われていますが、bashは簡単に利用できるもののプログラミング言語としてはバグを生みやすい、辛い言語だと思います。 ここで紹介しているのはいわゆるコーディング規則というよりも、バグ防止と可読性向上のためのルールをTips集的にまとめたものです。 bashにおいてまだまだ注意するところはありそうですが、多少なりともわかりにくいスクリプトの削減になればと期待しています。 [追記: 2018-08-22] はてブにて以下のコメントをいただきました。 bashスクリプティング研修の資料を公開します - エムスリーテックブログ bashで50行以上になった

    bashスクリプティング研修の資料を公開します - エムスリーテックブログ
  • プログラマーの君! 勘違いするな! シェルスクリプトでは読みやすさのためにスペースを置くな!! という話 - Qiita

    プログラマーの君! 勘違いするな! シェルスクリプトでは読みやすさのためにスペースを置くな!! という話ShellScriptBash 普通のプログラミング言語での開発に慣れた人ほどシェルスクリプト、特にBashで戸惑う部分の一つに、i = 0のように空白を開ければエラーになるし、かといってif[$i!=0]のように詰めてもやっぱりエラーになる、という点が挙げられます。書きたい物を思うように書けなくて「なんだよこのクソ言語は!!!」とブチギレる人は少なくないのではないでしょうか。この記事では、そのイライラを解消するポイントをお伝えしようと思います。 以下、特に断り無く「シェルスクリプト」と書いている場合はすべて「Bashのスクリプト」という意味になります。zsh等他のシェルではまた事情が異なりますので、ご注意ください。 (※以前プログラマーの君! 騙されるな! シェルスクリプトはそう書いち

    プログラマーの君! 勘違いするな! シェルスクリプトでは読みやすさのためにスペースを置くな!! という話 - Qiita
  • シェルスクリプトにおける [ と [[ - 理系学生日記

    シェルスクリプトで条件分岐を書くとき、[ を使ったり [[ を使ったりすることになると思います。 POSIX の test にも記載がありあすが、[ は test と同じ機能を持つことになっており、同じ実装であることも多いです (ただし、[ として実行されるか、test として実行されるかに依って挙動が変わり得る)。 一方で、[[ は POSIX で定義はされていない、Bash 等の高機能シェルでの拡張になります。 [ と [[ は、当然ながら同じような機能を持っています。そりゃ、後者は前者の拡張ですからね。一方で、「拡張」であるが故に、[ と [[ で異なる挙動も存在します。 演算子 たとえば比較の演算としては以下のような挙動のちがいがあったりします。なお、[ への有無については、POSIX 定義という観点であって、シェル実装によっては普通に使えるものもあります。 機能 [ [[ 備考

    シェルスクリプトにおける [ と [[ - 理系学生日記
  • bashのシェルスクリプトで拡張子を取得して利用するときのまとめ - それマグで!

    特定の拡張子に○○する的なことはよくある シェルスクリプトを書いていると拡張子で判別したいことはよくある。 bashで拡張子を取得するには bashのブレース展開が一番ラクです。 path=/etc/apache2/httpd.conf extension=${path##*.} #=> conf 特定のディレクトリの中で拡張子を取得するには xargs と組み合わせる find | xargs -I@ bash -c 'path=@; echo ${path##*.}' そもそも拡張子の取得が必要ですか? そのシェルスクリプトで拡張子をもとに検索をしたいなら、拡張子を取る必要はないかもしれないですよ。 指定した拡張子を検索 grep . -R --include=*.php 指定した拡張子のファイルを列挙する。 find -type f -name '*.php' ファイル名がマッチする

    bashのシェルスクリプトで拡張子を取得して利用するときのまとめ - それマグで!
  • 異常時にちゃんと止まるシェルスクリプト - 超ウィザード級ハッカーのたのしみ

    自動化は大切ですが、自動化するときは異常時にちゃんと止まるようにしなければなりません。トヨタ自動車でいうところのニンベンのついた「自働化」である。なぜ自働化が必要かというと、エラー時に止まってくれない機械は稼働中に人が張り付いて見守っていなければならないからです。また、エラーが起こったのちに機械が動き続けるならば、異常なアウトプットが出力され続けることになり、異常なアウトプットを処理しなければならないというムダが発生します。自動化のためのスクリプトを書くときは、エラー時には止まるように作らなければなりません。 しかしながら、シェルスクリプトは恐ろしいことにエラーが起きても既定ではそのまま処理を続けていきます。異常時にちゃんと止まる自働化スクリプトとするためには以下をスクリプトの先頭に書くと良いでしょう。 set -eu -o pipefail trap 'echo "ERROR: line

    異常時にちゃんと止まるシェルスクリプト - 超ウィザード級ハッカーのたのしみ
  • SQL用のテストデータをシェルスクリプトで作成 | DevelopersIO

    はじめに 簡単なテストをする際にはテストデータを作る事がありますが、毎回面倒だなと思っていたので、シェルスクリプトで簡単に作れないか調べてまたので備忘録として書いておきます。 環境 Mac OSX 10.10.5 Yosemite シェルスクリプト: create_tsv.sh #!bin/bash ## 開始時間を標準出力(%sで秒数。%Sとは違う) start=`gdate +%s` ## 作成する行数 ROWS=$1 ## 作成するファイルパス FILEPATH=$2 # ファイル作成 > $FILEPATH # ユニークなランダム文字列を作成 -> 配列にする array=(`cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n \`expr $(expr $ROWS + 1) + 1\` |

    SQL用のテストデータをシェルスクリプトで作成 | DevelopersIO
  • シェルスクリプトの罠を避ける三つの tips

    シェルスクリプトは、Unix 系環境で仕事をするエンジニアなら誰もが一度は書くであろうにもかかわらず、書き方や特性を熟知している人が少ない言語です。この記事は、シェルスクリプトを書くときに罠を踏まないようにするために最低限あなたが気を付けるべき tips 集です。「たかがシェルスクリプト」とは思わないでください。生半可に書かれたシェルスクリプトはあなたの (チームの) 生産性をかえって低下させます。 Shebang に bash を明示しろ Bash でしか使えない機能のことを俗に Bashism と言います。Bashism はもちろん Bash 以外のシェルでは動きません。これに関するありがちな罠は、以下のように発生します。 Bash が /bin/sh として使われている環境でシェルスクリプトを書く。うっかり Bashism がシェルスクリプトに含まれていても、 /bin/sh は何も

    シェルスクリプトの罠を避ける三つの tips
  • 今までシェルスクリプトで順番に実行していたコマンドを簡単に並列実行させる方法 - Qiita

    スクリプトの実行に時間がかかるのをなんとかしたい シェルスクリプトで複数のコマンドを実行させたいとき、上から順に1つずつ実行するから終わるまで時間がかかってつらい。 既存のスクリプト(上から順に実行される) #!/bin/bash param=huga ./hoge.sh aa 1 $param ./hoge.sh bb 2 $param ./hoge.sh cc 3 $param ./hoge.sh dd 4 $param #!/bin/bash param=huga cat << EOS | perl -pe 's/\n/\x00/' | xargs -0 -n 1 -P 3 -I{} sh -c '{}' ./hoge.sh aa 1 $param ./hoge.sh bb 2 $param ./hoge.sh cc 3 $param ./hoge.sh dd 4 $param EO

    今までシェルスクリプトで順番に実行していたコマンドを簡単に並列実行させる方法 - Qiita
  • プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話 - Qiita

    記事が切っ掛けとなってお声がけを頂き、記事の増補リファイン版となる記事をSoftwareDesign 2018年1月号のシェルスクリプト特集第2章として執筆しました。リファイン版には、この記事で触れていない文法面での分かりにくさについての解説が含まれています。その文法面での分かりにくさの解説の一部に相当する記事もありますので、ぜひそちらも併せてご覧下さい。 Shell Script Advent Calendarをご覧の皆様、図々しくも5日目に続く2度目のエントリーのPiroです。 前回は自作のBashスクリプト製Twitterクライアントをネタに実装を解説しましたが、今日は他の言語で多少のプログラミング経験はあるんだけど、どうにもシェルスクリプトは苦手だ……という人のための、シェルスクリプトによるプログラミングの勘所を解説してみようと思います。多分、プログラミング入門レベルの人や上級

    プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話 - Qiita
  • これだけ覚えておけばOK!シェルスクリプトで冪等性を担保するためのTips集 - Qiita

    「シェルスクリプトって冪等性ないじゃないですか」 そんなことをよく耳にします。しかし、if文を入れるだけで簡単に冪等性を担保したシェルスクリプトを書くことができます。 今回は、私が使う条件式を紹介します。基的な形式なものなので、組み合わせると幅が広がりますよっ! ファイル/フォルダ関係 ファイルの存在確認 -e 'ファイル名'で「ファイル名」が存在しているかチェックします。 if [ -e 'ファイル名' ]; then # ファイル/フォルダが存在していれば、ファイル/フォルダを削除するなど rm ファイル名 fi

    これだけ覚えておけばOK!シェルスクリプトで冪等性を担保するためのTips集 - Qiita
  • コマンドラインツールを書くなら知っておきたい Bash の 予約済み Exit Code - Qiita

    上記の表の通り,Exit Code 1, 2, 126〜165, 255 は特別な意味を持ち,スクリプトやプログラム内で exit に指定するパラメータとしては避けるべきである.とりわけ,Exit Code 127 はトラブルシューティングで混乱の元である("command not found" で終了したのか,プログラム固有のエラーなのか区別できなくなる).しかしながら,多くのスクリプトが exit 1 を一般的な実行を続行できないエラーとして使っている.Exit Code 1 は Bash の一般的なエラーを含め,とても多くのエラーで発生しうるので,デバッグの時に切り分けが大変になるだろう. Exit Code を体系立てて定義する試みはある(/usr/include/sysexits.h)が,これは C と C++ プログラマー向けである.スクリプトに関しても同様な感じにするのが適切

    コマンドラインツールを書くなら知っておきたい Bash の 予約済み Exit Code - Qiita
  • initial-setup-script-for-centos.html

    CentOSでサーバを立てたときに、まず最初に必ずやっておきたい初期設定がある。 その作業の一覧が以下のとおり。 パッケージを最新化する 新規ユーザを作成する suコマンドを制限する suコマンドを実行可能なユーザ・グループを限定する 特定のグループ以外suコマンドでrootに昇格できないように制限する パスワード入力なしでsudoコマンドを利用できるようにする ssh接続を制限する rootユーザのsshログインを禁止する sshで公開鍵認証のみ接続を許可する sshでパスワード認証を禁止する 公開鍵をサーバに登録する sshdサービスを再起動する iptablesまたはfirewalldの設定 ←今回はやらない Webアプリケーションをつくりたくて、WebサーバとAPサーバを用意しようと思ったが、毎回この初期設定をするのが超絶メンドそう...。 ということで、自動化するために初期設定を

    initial-setup-script-for-centos.html
  • 最近覚えたシェルスクリプトの小ネタ - カメニッキ

    シェルスクリプト神から教えていただいた。忘れないように書いとく (追記)聞いて、自分の記憶した内容をそのまま書いちゃったので、ちゃんとマニュアル通りか確認してなかったので反省 $ man bash 目次 xargsでfunctionを叩く 連想配列もどき 変数間接参照 なんでもかんでもawkで整形しない 文字列の末尾から数えて○文字目を△文字取り出す 番外編:やたら if [ ]; then を使わない ※Markdownで目次の書き方がわからんかった xargsでfunctionを叩く 下の例だと find xxxx | xargs cp xxxx ってかけば良さそうでイマイチだけど、もっと複雑な処理やらせたいときに。 前はこう書いてた #!/bin/bash for x in `find /var/www -name xxx` do cmd="cp -v /hoge/fuga/xxx

    最近覚えたシェルスクリプトの小ネタ - カメニッキ
  • シェルスクリプトで文字列のハイライトをsedで削除する

    B! 13 0 0 0 sentaku というシェルスクリプトのツールをアップデートしている時に、 文字列のハイライト部分を変換したいことがあったのでそのメモ。 シェルスクリプトでの文字列の装飾 sedで削除する sentaku シェルスクリプトでの文字列の装飾 printfのコマンドで文字列を出力する際、 printf "\e[7maaa\e[m" とすると、aaaをバックグランドと文字色を反転させて表示させる事が出来ます。 (文字列はクォートで囲う必要あり。) ここで最初の\eはエスケープで[とmで挟まれた7の数字がこの反転を指定しています。 N 表示 0 デフォルト 1 太字(Bold)、または強調表示 2 薄く表示、もしくはsecond colorの指定があればそれ 3 イタリック 4 アンダーライン 5 ゆっくり点滅 (<150/分) 6 素早く点滅 (%gt;150/分) 7

    シェルスクリプトで文字列のハイライトをsedで削除する