You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
I have a data with the following format: foo<tab>1.00<space>1.33<space>2.00<tab>3 Now I tried to sort the file based on the last field decreasingly. I tried the following commands but it wasn't sorted as we expected. $ sort -k3nr file.txt # apparently this sort by space as delimiter $ sort -t"\t" -k3nr file.txt sort: multi-character tab `\\t' $ sort -t "`/bin/echo '\t'`" -k3,3nr file.txt sort: mul
こういうシェルスクリプトがあるとする. -eしてるので,途中でエラーが出たときには止まってほしい. #!/bin/bash -e echo 1 ehco 2 echo 3 止まってくれ……!! % ./a.sh 1 ./a.sh: line 4: ehco: command not foundちゃんと止まった. ところで,bash ./a.shとか,cat a.sh | bashとかして実行してみると,3まで実行されてしまう!!!. % bash ./a.sh 1 ./a.sh: line 4: ehco: command not found 3 % cat ./a.sh | bash 1 bash: line 4: ehco: command not found 3 こういったことがあってはつらいので,bash -eじゃなくて,set -eしましょう. #!/bin/bash set -
原文は2015年8月22日時点のものを利用しており、それ以降に追記、更新されている可能性があります。 本翻訳は原作者の許可を得て公開されています。 Thanks for GreyCat! このページはBashプログラマーが陥りがちなよくあるエラーについてまとめました。以下の例は全てなんらかの欠陥があります。 クオートをいつも使い、どんな理由があっても単語分割を使わなければ、多くの落とし穴からあなた自身を守ることができます!単語分割はクオート表現をしない場合にはデフォルトでオンになっている、Bourneシェルから継承された壊れたレガシーな設計ミスです。落とし穴の大半はクオートされていない展開になんらか関連し、単語分割しその結果をグロブします。 1. for i in $(ls *.mp3) BASHプログラマーたちがループを書く際にもっとも犯しがちなよくあるミスは以下のような感じです。: f
なぜStackOverflowか Upvote/Downvoteの仕組みにより、自然とベストプラクティスが蓄積されている 世界中のプログラマの目に晒されているため質が高い 答えが幾つか出されているため視野が広がる・一つの手法に固執することがない 英語の勉強にもなる StackOverflowのおすすめの見方 質問はまずしっかり理解する それに対する答えを比較してみて、なぜそう動くのかを考える コメント欄はFont Size的には小さいが、かなり濃いコメントが書かれていることが多いので暇なら目を通す 10. Looping through the content of a file in Bash? ファイルの内容をループで取得するためのベストプラクティス。 (2015/10/23 : 本節修正しました。@heliac2000 さん、@kawazさん、ありがとうございました。詳しくは本記事コ
2011.8.25追記: そりゃあありますよね。ターゲットのプラットフォームで標準で使えるようならば可読性も高いしこちらの方がよいと思います。 僕はこれから作るものはたぶんreadlinkに乗り換えます。masaruyokoi様ありがとうございました。 コメントで教えていただきました。 masaruyokoi on 2011年8月25日(木曜日) at 12:06 said readlink -f や -e を使うと良いですよ。 Debian や FreeBSD では realpath というコマンドもあります。 以下はオリジナルエントリです。 シェルスクリプトで自分の絶対パスを知る方法はこんな方法しかないんだろうか? #!/bin/sh D=`dirname $0` echo `cd $D;pwd` Pythonだとしょっちゅう書いてるアレ。 #!/usr/bin/env/ python
初級者向けに『自分がシェルスクリプト書くときに気をつけていること』をまとめてみました。 @masudaKの『シェルスクリプトを書く際に気を付けていること8箇条』の乗っかりエントリです。 内容は重複しないように書いてますので合わせて読んでください! 基本的にLinuxの/bin/sh、/bin/bashを想定しています。 テキスト処理は標準入力から受け取って標準出力に出す テキストを扱う小さなツールを作りましょう。 引数はオプション情報を渡すのに使います。 そうすればgrep、sort、uniqなどの便利なコマンドとパイプで連携できます。 grep ERROR /tmp/test.log | my_cmd1.sh 192.168.1.1 | sort 全てを実行する1つのスクリプトを作るのはたいへんだし、応用が効かないです。 人間に伝えたいメッセージは標準エラー出力に出す パイプでつないだ時
ログファイルを空にしたいときなど、いつも忘れるので・・・。 : > file % : > file これが一番シンプルですね。 : という区切りのコマンドがあり、それを file にリダイレクトしてあげるとファイルが空になります。man bash には以下のように記述されています。おそらくzshでは一番シンプルです。 ・・・ A : separates the event specification from the word designator. ・・・ ・ ・ ・ SHELL BUILTIN COMMANDS Unless otherwise noted, each builtin command documented in this section as accepting options preceded by - accepts -- to signify the end of
拡張 POSIX シェルスクリプト Advent Calendar 2013、6日目の記事です。 本日のお題は「一時ファイルの作成と削除」ですが、 よくあるシェルスクリプトのダメ出しネタになってしまいました。 安全な一時ファイルの作成方法 たとえば、こんな感じのありがち(?)なスクリプトがあったとします。 意味のない処理内容ですが、雰囲気だけ察してください。 #!/bin/bash tmpfile=/tmp/words.tmp rm -f $tmpfile echo 'しにたい' >>$tmpfile echo 'とりあえずねよう' >>$tmpfile sleep 3 echo -n '今どんな気持ち? ' read feeling echo $feeling >>$tmpfile cat $tmpfile rm $tmpfile 全然駄目ですね。 もし「何にも問題ないじゃないか!」とい
概要 bashの記法は独特なものが多く毎回ググってしまうのでまとめて(と言いつつまとまりがないですが。。。)おこうと思います。 ある程度まとまってからpostしようとか思ってたらごちゃごちゃになっちゃいました。 bashで使えるという意味なのでposixシェル共通のネタも混ざってます。 随時更新します。参考になれば幸いです。 参考 man bash リファレンスマニュアル Advanced Bash-Scripting Guide カッコ色々 bashでは色々なカッコがありますが、よく違いが分からず使っていたりするのでまとめてみます。 []と[[]] []はtestコマンドのaliasです。[[]]じゃないとできないこととしては、以下のようなものがあります。 空白を含む文字列をクォートしなくてOK var='abc 123' # []の中だとクォートしないとエラーになる [ $var =
bashでfor文はとても便利。 for inを使う https://gist.github.com/daipresents/b8ecd21e7647f04740239a0ca6dd6f92.js?file=for-in.txt lsを使ってディレクトリにあるファイル名でループ https://gist.github.com/daipresents/b8ecd21e7647f04740239a0ca6dd6f92.js?file=for-in-ls.txt lsをさらに応用して拡張子txtだけループ https://gist.github.com/daipresents/b8ecd21e7647f04740239a0ca6dd6f92.js?file=for-in-ls-grep.txt ワンライナー https://gist.github.com/daipresents/3235658b
フィルタを使用した文字列操作 2 cut コマンドを使用したフィルタリング 特定のフィールドを切り出す テキストファイルなどから n フィールド目を切り出す、n-m フィールド目を切り出す、といった処理には cut コマンドを使用する。 # numフィールド目を切り出す。 cut -d'デリミタ' -fnum # num1フィールド目とnum2フィールド目を切り出す。 cut -d'デリミタ' -fnum1,num2 # num1-num2フィールド目を切り出す。 cut -d'デリミタ' -fnum1-num2 → cut コマンドの -d オプションで特定のフィールドを切り出す。 cut コマンドにフィールド間の区切り文字となるデリミタと切り出すフィールド番号を指定することで、指定したデリミタによって区切られた特定のフィールドを切り出すことができる。 デリミタを指定しない場合は、デフォ
UNIXサーバへのログイン時には,「login:」などのプロンプトが表示されている場合に入力がない状態が続くと,自動的にタイムアウトされる。このタイムアウトするまでの時間は,/etc/login.defsを次のように編集すればよい。 /etc/login.defs ~中略~ # Max time in seconds for login # LOGIN_TIMEOUT 60 # ~中略~ また,個々のユーザー別ではログイン後のタイムアウト設定にも注意したい。シェル環境変数「TMOUT」を編集すると秒数を指定可能だ(ただしbashの場合。tcshでは「autologout」)。設定秒数が経過すると,「"timed out waiting for input: auto-logout"」という表示と共に自動ログアウトされる。 机の前から離れ,不用意にほかの人に操作されないようにする手段と
シェルスクリプトの中で、スペース区切りもしくはタブ区切りのレコードを扱うことがよくあると思います。 たとえば、前回のエントリ「AWS CLIとjqを使って、AWSのELBボリュームがアタッチされているEC2インスタンス名を出力するワンライナーを書いた - 双六工場日誌」のスクリプトの出力は以下のようになります。 i-ec56a9f5 vol-07d00601 servername i-ec56a9f5 vol-8f550991 servername このようなレコードの特定の列を取り出して、処理する際にどうするのが効率的か、というのがこのエントリのお題です。 非常に古い話題なので、昔からシェルスクリプトを書いている人には自明な話ではありますが、最近、シェルの標準機能の話を聞く機会がなく、失われつつある技術になってきている気がしているので、改めて確認ということで。 例として挙げたレコードから
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く