タグ

shellscriptに関するretletのブックマーク (45)

  • Bashのよくある間違い | Yakst

    原文は2015年8月22日時点のものを利用しており、それ以降に追記、更新されている可能性があります。 翻訳は原作者の許可を得て公開されています。 Thanks for GreyCat! このページはBashプログラマーが陥りがちなよくあるエラーについてまとめました。以下の例は全てなんらかの欠陥があります。 クオートをいつも使い、どんな理由があっても単語分割を使わなければ、多くの落とし穴からあなた自身を守ることができます!単語分割はクオート表現をしない場合にはデフォルトでオンになっている、Bourneシェルから継承された壊れたレガシーな設計ミスです。落とし穴の大半はクオートされていない展開になんらか関連し、単語分割しその結果をグロブします。 1. for i in $(ls *.mp3) BASHプログラマーたちがループを書く際にもっとも犯しがちなよくあるミスは以下のような感じです。: f

    Bashのよくある間違い | Yakst
  • どの環境でも使えるシェルスクリプトを書くためのメモ ver4.60 - Qiita

    シェルスクリプトは環境依存が激しいから…… などとよく言われ、敬遠される。それなら共通しているものだけ使えばいいのだが、それについてまとめているところがなかなかないので作ってみることにした。 「どの環境でも使える=POSIXで定義されている」と定義 「どの環境でも使える」とは、なかなか定義が難しい。あまりこだわりすぎると「古いものも含め、既存のUNIX全てで使えるものでなければダメ」ということになってしまう。しかし、私個人としては 今も現役(=メンテナンスされている)のUNIX系OSで使いまわせること にこだわりたい。 とはいっても全てのOSやディストリビューションについて調べられるわけではないので、この記事では基的に最新のPOSIXで定義されていることをもって、どの環境でも使えると判断するようにした。(飽くまで「基的に」ということで) 従って、互換性確保のため、シェルの中で使ってよい

    どの環境でも使えるシェルスクリプトを書くためのメモ ver4.60 - Qiita
  • 検索条件に一致するファイルを他所にコピーしてからシンボリックリンクに置き換えるシェルスクリプト - retlet.net

    iTunesでPodcastを結構な数購読しているんだけど、これが何年も溜まってそれなりに容量を喰うようになってしまった。MacBook AirのSSDだとちょっとバカにならない。じゃあNASに移そうとなったものの、あっちこっちにPCを持ち運んで使う関係上、iTunesフォルダ自体をNASに置くのはちょっと都合が悪いし嫌な感じだった。 →更新日時の古いPodcastだけをNASにコピーして、シンボリックリンクに置き換えてしまえばいいんでない? というわけで表題のシェルスクリプト書いた。 cp_and_replace.sh 具体的な動作は、ディレクトリAにfindコマンド(オプション指定可)を実行してヒットしたファイルをディレクトリBに階層ごとコピー。その後、AのファイルをBへのシンボリックリンクに置き換える。 なお手元のMac OS X 10.9.4でしか試していない。 階層を保ったコピー

    retlet
    retlet 2014/08/29
    書いた
  • 標準出力と標準エラー出力 - Qiita

    Help us understand the problem. What is going on with this article?

    標準出力と標準エラー出力 - Qiita
  • シェルスクリプトで、ある順番以降の引数を取得する - Qiita

    $#には、引数の数が格納されています。なので、この場合は3番目以降の全部なので、全体の数から、いらない2つを引いているわけです。 てか、↑をやんなくても、3番目以降「全部」なら${@:3}でもよかった。つまり、開始の順番だけでよい。3番〜5番目とかなら「3番目以降の3つ」という意味で ${@:3:3}と書く必要がある。 応用例として、2個の引数のあと、--以降にオプションとして解釈されたくない文字列がある場合、以下のように書けます。

    シェルスクリプトで、ある順番以降の引数を取得する - Qiita
  • パイプ出力を現在のシェル上のwhileに喰わせる上手いやり方 - Qiita

    これはコマンドの標準出力を1行ずつ f という変数に読み込んで何らかの処理を行うってやつです。 whileの中でやることがファイル操作などの一般的なことならこれで全然問題ないんですが、実行中のシェル環境に対する処理(具体的には変数の設定など)を行おうとすると期待通りにいってくれなくなります。例えばこんな感じ↓ # findで見つけたファイル名をfilesという配列変数に詰め込みたい files=() find -type f | while read -r f; do files+=("$f") done echo "${files[@]}" # 確かにfilesに値を入れた筈なのに空が出力される?? これはパイプで繋げると後ろのwhileがサブシェルで実行されてしまうために起こる現象です。噛み砕いて説明すると… 現在findを実行中のbashとは別に、パイプの後ろでもう一つのbashが起

    パイプ出力を現在のシェル上のwhileに喰わせる上手いやり方 - Qiita
  • case 文の使用方法 - UNIX & Linux コマンド・シェルスクリプト リファレンス

    case 文の使用方法 case 文とは? case 文は C言語や Java言語の switch 文に該当する制御文で、if 文と同じように処理を分岐するために使用されるものである。 分岐条件には判定対象となる 1つの値と、その値と照合される複数のパターンを指定する。case 文は値とパターンの照合を行い、パターンと一致した場合はそのパターンと共に指定されている処理を実行する。 case 文は if 文のように複雑な分岐条件を評価するのには向かないが、単純な分岐条件での多方向分岐に優れた文である。 → case 文は指定した値と複数のパターンとのマッチングにより多方向分岐を行う。 case 文には判定に使用される値と、それと照合される複数のパターン、およびそのパターンに一致した場合に実行する処理を指定する。 パターンは任意の数指定可能で、上から順に値との照合を行い、一番最初に一致したパタ

    case 文の使用方法 - UNIX & Linux コマンド・シェルスクリプト リファレンス
  • bashの正規表現マッチングの使い方 - adsaria mood

    あるフリーウェアのインストール用bashプログラムを見ていたら次の様なものがあった。(以下の例は簡略化してある。) STRING="abc" if [[ "$STRING" =~ "^ab[cd]$" ]]; then echo "matched" else echo "unmatched" fi if文の条件表現の中に“=~”というオペレータがある。manを見ると =~ オペレータは文字列を正規表現と比較するとある。知らなかった。bashの文字列比較で正規表現が使えるとは。私は正規表現比較が必要な時はgrepに喰わせて判断していたのだが、これを使えば簡単にできる。 ところが、だ。上のプログラムが期待通りに動かない。上の例では =~ の左辺と右辺の正規表現はマッチするはずだが、結果は“unmatched”。色々と正規表現を変えてみたが、どれとしてマッチングしない。しかし、if文を次のように

    bashの正規表現マッチングの使い方 - adsaria mood
  • シェルスクリプトでの正規表現マッチ - Qiita

    シェルスクリプトで正規表現でのマッチングを使いたい場合,少しぐぐってみると case 文を使えという内容のものがよくヒットするようですが,expr コマンドでも正規表現が使えます. #!/bin/sh if expr "aaabbc" : "b+c$" > /dev/null; then echo "hoge" fi # => hoge 正規表現を用いた場合,expr はマッチした位置や()でグループ化した結果を出力するので,要らない場合は /dev/null に捨てます. ちなみに, zsh では [[ ]] を用いて自然に正規表現が書けます.

    シェルスクリプトでの正規表現マッチ - Qiita
  • 変数が未定義かどうか判別する - わからん

    「覚えて便利 いますぐ使える!シェルスクリプトシンプルレシピ54」を読んでいて、わからなくて調べたところのメモ。 以下は、レシピ2.3 で紹介されている変数が未定義かどうか判別するコードです。 #!/bin/sh undef="NO" if [ "${v-UNDEF}" = "UNDEF"]; then #(1) if [ "$v" = ""]; then #(2) undef="YES" fi fi (1) がわからなかったのですが、${v-UNDEF} のハイフン以降が、v が未定義だった場合のデフォルト値として、v に設定されるという構文でした。(2) はで解説されている通り、もともとの v の値が UNDEF ではないことの確認です。 man bash より。コロンの有無による違いは、「入門UNIXシェルプログラミング」p46 あたりを参照。 ${parameter:-word}

  • bash によるオプション解析 - Qiita

    すこし記事が長いため、簡単なアウトラインを書いておきます。要点だけ掴みたい場合は、最終項の「まとめ」を読むのがいいかもしれません。 コマンドライン引数の一般的な解析手法 それぞれの特徴 〜 getopt と getopts の違い getopts(メリット・デメリット) getopt(メリット・デメリット) 自前で解析しちゃう(唯一のデメリット) まとめ ============================= コマンドライン引数を処理する一般的な手法として、 getopts getopt shift などで自力で解析 といった具合に、上から順に考えつくかと思います。getopt(3) は UNIX において、コマンドの引数を処理する一般的な C 言語のライブラリ関数です。それを用いて実装されたコマンドが getopt(1) です。Bourne シェル系だと内部関数になりますが、同系統の

    bash によるオプション解析 - Qiita
  • 改行コードと「command not found」の関係について - カイワレの大冒険 Third

    作ったシェルスクリプトでどうも「command not found」と言われる。パスは間違ってないし、そんな思い当たる節もない。 ただ、追ってたら、やっと頭に入ったので、無知ながら晒してみる。 コマンドとエラーはこんな感じ。 $ ./test.sh -d 2 -s '192.168.1.11' : command not foundet/test.sh: line 15 :: command not foundet/test.sh: line 23 :: command not foundet/test.sh: line 27 :'home/www/test.sh: line 31: syntax error near unexpected token `in'home/www/test.sh: line 31: ` case $OPT ingetoptsを使って、オプションを指定して、そ

    改行コードと「command not found」の関係について - カイワレの大冒険 Third
  • 'find -exec' a shell function in Linux

    Is there a way to get find to execute a function I define in the shell? For example: dosomething () { echo "Doing something with $1" } find . -exec dosomething {} \; The result of that is: find: dosomething: No such file or directory Is there a way to get find's -exec to see dosomething?

    'find -exec' a shell function in Linux
  • 『UNIX/Linux の find -exec の引数にはシェルの構文を使えない.』

    UNIX/Linux の find コマンドの -exec アクションって,シェルを起動せずに直接コマンドを呼び出すんですね! 今まで知りませんでした (恥). きっかけは,OKWave でのfind に関する質問.-exec の引数で,シェルの構文 `…`を使うにはどのようにエスケープすればいいのか (私も今までたまに使おうとしては挫折していた) を調べるために find のソースを少しだけ覗いてみると …あれっ,-exec でシェルを起動している気配がない!? 直接コマンドを呼び出しているみたい.それを確認するため,シェルコマンドである alias を -exec に指定して, find . -exec alias \;とやってみると,予想どおり次のようになった. find: alias: そのようなファイルやディレクトリはありません find: alias: そのようなファイルやディ

  • シェルスクリプトを書くときはset -euしておく - Qiita

    エラーがあったらシェルスクリプトをそこで打ち止めにしてくれる(exit 0以外が返るものがあったら止まるようになる)。「あっあれここでうまくいってないからデータ準備できてないのにあれあれっもうやめて!」ってなるのを防げる。 set -u 未定義の変数を使おうとしたときに打ち止めにしてくれる。Perlでいうuse strict 'vars';的なもの。 って気軽な気持ちで書いてしまって、「ん、やたら時間かかると思ったらスペルミスうわなにをするやめ」ってなるのを防げる。 一部だけ例外にしたい はてなブックマークのコメントより -e は command1 || command2 みたいなことが出来なくなるの使うことないな。-uは付けといて良いが。 確かにおっしゃるとおりですね。コマンドの失敗を考慮して書いている部分については(もしくはやたらexit 0以外するコマンドを呼ばないといけないときなど

    シェルスクリプトを書くときはset -euしておく - Qiita
  • シェルスクリプトを書く際に気を付けていること8箇条 - カイワレの大冒険 Third

    エンジニアという職業柄かシェルスクリプトを書くことはちょくちょくあるのですが、自分なりに気を付けていることを備忘録&自分への戒めも含めて、簡単に書いてみたいと思います。 変数は大文字 シェルスクリプト書いていれば変数の出番は至るところであるでしょう。その際、可読性を増すように、変数は大文字を使っています。 RET=`cmd1`みたいに。好みの問題もあるでしょうが、分かりやすいので。 クオテーションは選ぶ クオテーションにはシングルだったり、ダブルだったり色々ありますが、使い分けておいたほうがよいでしょう。 変数の展開がないようであれば、シングルクオーテーションのほうがスマートでしょうし、展開があるのならダブルクオーテーションを使えばと。 ダブルクオーテーションを使うのにも意味があって、変数は「$RET」のようにクオテーションで囲まなくても動作はたいていするのですが、 echo "${RET

    シェルスクリプトを書く際に気を付けていること8箇条 - カイワレの大冒険 Third
  • シェルスクリプトを書くときに気をつけていること(その1) - mikedaの日記

    初級者向けに『自分がシェルスクリプト書くときに気をつけていること』をまとめてみました。 @masudaKの『シェルスクリプトを書く際に気を付けていること8箇条』の乗っかりエントリです。 内容は重複しないように書いてますので合わせて読んでください! 基的にLinuxの/bin/sh、/bin/bashを想定しています。 テキスト処理は標準入力から受け取って標準出力に出す テキストを扱う小さなツールを作りましょう。 引数はオプション情報を渡すのに使います。 そうすればgrep、sort、uniqなどの便利なコマンドとパイプで連携できます。 grep ERROR /tmp/test.log | my_cmd1.sh 192.168.1.1 | sort 全てを実行する1つのスクリプトを作るのはたいへんだし、応用が効かないです。 人間に伝えたいメッセージは標準エラー出力に出す パイプでつないだ時

    シェルスクリプトを書くときに気をつけていること(その1) - mikedaの日記
  • 特定のディレクトリをzip化するスクリプトを書いたときにぶつかった問題とその対処法 - Qiita

    概要 複数のディレクトリを別々にzip化するスクリプト組んだら思いの外はまったので、備忘録的に、勉強メモ的に記録しておきます。 内容 「特定のディレクトリ」を「カレントディレクトリにある全てのディレクトリ」だとしましょう。 はじまりのスクリプト -type d はディレクトリ指定、-depth 1はカレントディレクトリにあるもの、という条件指定です。-depth 1がないとカレントディレクトリ自体もヒットするので注意(もちろんカレントディレクトリを外すやり方は他にもいっぱいあると思いますが) これでうまくいったように見えたんですが、特定のディレクトリ名で失敗していました。 その一つは、失敗する条件はよく分かってないんですが、zipの第一引数に.zipを省略せずに書いた場合に収まりました。

    特定のディレクトリをzip化するスクリプトを書いたときにぶつかった問題とその対処法 - Qiita
  • Macのxargsの-Iオプションに潜む罠 - Qiita

    $ echo "64byte string.**************************************************" | xargs -I% echo %%%% 64byte string.**************************************************64byte string.**************************************************64byte string.**************************************************% 最後の%が64byte string***に展開されてません。これはxargsで-Iオプションを使うと引数にとるパイプから受け取った文字列を展開したコマンドが、256byte以上になることを許さないからです(日語むずか

    Macのxargsの-Iオプションに潜む罠 - Qiita
  • cpio を使用してファイルシステム間でディレクトリをコピーする (Solaris のシステム管理 (第 1 巻))

    cpio を使用してファイルシステム間でディレクトリをコピーする cpio (コピーインとコピーアウト) コマンドを使用して、個々のファイル、ファイルグループ、またはファイルシステム全体をコピーできます。この節では、cpio コマンドを使用してファイルシステム全体をコピーする方法について説明します。 cpio コマンドは、ファイルのリストを取り出して 1 つの大型出力ファイルにコピーするアーカイブプログラムです。また、復元しやすいように、個々のファイルの間にヘッダーを挿入します。cpio コマンドを使用すると、ファイルシステム全体を別のスライス、別のシステム、またはテープやフロッピーディスクなどの媒体デバイスにコピーできます。 cpio コマンドは、媒体の終りを認識し、別のボリュームを挿入するように促すプロンプトを表示するので、複数のテープやフロッピーディスクが必要なアーカイブを作成するに