シェルスクリプト総合 その24©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2014/11/11(火) 00:54:03.43□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0002名無しさん@お腹いっぱい。
2014/11/11(火) 01:00:47.570003テンプレ ◆01VkPKFOHeoR
2014/11/11(火) 03:40:09.81次スレ立ったか...
一応前スレでテンプレ書いた手前、書き込んでおきます
0004テンプレ ◆01VkPKFOHeoR
2014/11/11(火) 03:41:35.86初心者、学生、アマチュア、プロ、シェルの種類や OS を問いません。
スクリプトのお勉強・自慢・腕試しなどにどうぞ。
まずはテンプレートをご覧下さい。
□A. お約束
1. 特記なき場合は #!/bin/sh がデフォルトです。この場合可搬性に注意し、
Traditional Bourne Shell もしくは、POSIX 相当のスクリプトでお願いします。
bash / zsh / ksh / ash / dash や OS 等に依存する場合は、明示しましょう。
良く分からない方は、使用している OS を書いておけば OK です。是非ご参加下さい。
2. 質問する前に、まず自分で調べましょう。ただし、
「聞くは一時の恥、聞かぬは一生の恥」です。積極的に参加しましょう。
3. 相手を侮辱する発言、失礼な発言は差し控え、知的な議論を楽しみましょう。
4. 他者には様々な環境や事情、目的が有る事に留意し、無下に扱う様な発言は
控えましょう。
□B. お約束の補足
1. Mac OS X では、/bin/sh の実体は bash です。また、一般的に BSD 系 や
GNU/Linux の方は、/bin/sh がシンボリックリンクですので、注意して下さい。
ls -l /bin/sh や readlink -e /bin/sh で確かめて下さい。
2. 可搬性については、下記 F.1 を参照して下さい。
3. POSIX については、man 7 standards や下記 F.2 ( の特に Shell & Utilities )
を参照して下さい。
4. Traditional Bourne Shell とは、UNIX Version 7 から SVR4.2 の /bin/sh を元に
小さなの改変を加え主に商用 UNIX で残されているものです。( 下記 F.3 参照 )
5. Traditional Bourne Shell で入手しやすい sh は、後期 SVR4.0 から派生し、
SunOS 5 / OpenSolaris を経た、Heirloom Bourne Shell です。
SVR4 / SVID3 相当です。同様の Unix utilities も扱っています。
( 下記 F.3 参照 )
0005テンプレ ◆01VkPKFOHeoR
2014/11/11(火) 03:42:31.911. シェルスクリプトのことをシェルってゆーな
2. 知らないコマンドが出てきたら man コマンドで調べましょう。
3. UNIX には、シェルスクリプトに便利な小さなコマンドが色々あります。
apropos ないしは man -k でそれらしい単語による簡単な検索もできます。
4. シェルの構文や内部コマンドは man sh で。英語は LANG=C man shで。
5. 思い通りに動かないときは、まずは #!/bin/sh -x でトレースしましょう。
6. 適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awk / perl / javascript / ruby / python 等、他の (スクリプト) 言語の方が
適した処理にはそちらを使いましょう。
7. シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題は正規表現スレへ
8. csh / tcsh のシェルスクリプトは推奨されません。理由は下記を参照
http://www.speech-lab.org/~hiroki/csh-whynot.euc
9. cat file|すんなハゲ
a. 詳細は "Useless Use of Cat" UUOC で検索して下さい
b. 有用な場合も有ります Useful use of cat(1) 英文
http://www.in-ulm.de/~mascheck/various/uuoc/
□D. シェルスクリプトでよく使うコマンド
1. 制御・条件判定系: [, test, expr, true, false, yes, getopts
2. テキスト処理系: cat, awk, sed, tr, sort, uniq, grep, wc, head, tail, cut,
paste, comm, join
3. ファイル検索系: find ( スペースなどを含むファイル名を正しく処理するため、
find は -exec command {} + を推奨。
他に -print0、xargs は -0 オプションという方法もあるが Solaris 非対応 )
4. ディレクトリ系: basename, dirname
5. 出力系: echo, printf
6. 対話コマンド制御系: expect
7. http / ftp の処理自動化: wget, curl
0006テンプレ ◆01VkPKFOHeoR
2014/11/11(火) 03:43:24.341. Bourne Shell自習テキスト ( 1993年 ) pdf お薦め
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/sh-text/sh/
http://ayapin.film.s.dendai.ac.jp/~matuda/Lecture/PDF/sh-two.pdf
2. シェルを使おう - 導入からプログラミングまで - ( 2002年 )
http://www.netfort.gr.jp/~tomokuni/lms/shell/
3. UNIX FAQ LIST
http://www.nurs.or.jp/~asada/FAQ/UNIX/UNIX.FAQ.html
□F. 参考リンク
1. 可搬性関連
a. autoconf マニュアル 移植性のあるシェルプログラム
http://www.gnu.org/software/autoconf/manual/autoconf.html#Portable-Shell
http://www.geocities.jp/fut_nis/html/autoconf-ja/Portable-Shell.html
b. Portability talk [Bash Hackers Wiki] 英文
Obsolete and deprecated syntax も見る価値有り
http://wiki.bash-hackers.org/scripting/nonportable
c. How to make bash scripts work in dash 英文
http://mywiki.wooledge.org/Bashism
d. DashAsBinSh 英文
https://wiki.ubuntu.com/DashAsBinSh
e. Portable Shell Programming 英文
http://www.in-ulm.de/~mascheck/various/portability/
0007テンプレ ◆01VkPKFOHeoR
2014/11/11(火) 03:44:12.46The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition 英文
http://pubs.opengroup.org/onlinepubs/9699919799/
3. Traditional Bourne Shell 関連
a. The Traditional Bourne Shell Family History and Development 英文
http://www.in-ulm.de/~mascheck/bourne/
b. BourneShell / Where does the Bourne shell live? 英文
http://mywiki.wooledge.org/BourneShell
c. The Heirloom Bourne Shell 英文
http://heirloom.sourceforge.net/
4. マニュアル
a. The Base Specifications Issue 7, 2013 Edition 英文
http://pubs.opengroup.org/onlinepubs/9699919799/nfindex.html
b. FreeBSD 日本語マニュアル検索
http://www.jp.freebsd.org/man-jp/search.html
c. JM Project (Japanese)
http://linuxjm.sourceforge.jp/
5. FAQ 等
a. UNIXの部屋 ( 2011年 )
http://x68000.q-e-d.net/~68user/unix/
b. Linux JF (Japanese FAQ) Project
http://linuxjf.sourceforge.jp/
c. Advanced Bash-Scripting Guide 英文
http://www.tldp.org/LDP/abs/html/
d. Unix Programming FAQ 日本語訳 ( 2000年 )
http://www.race.u-tokyo.ac.jp/~moro/unix-programmer/
0008名無しさん@お腹いっぱい。
2014/11/11(火) 03:45:49.28a. web tool です。Vim syntastic や Emacs の Flycheck でも使えます
ShellCheck
http://www.shellcheck.net/about.html
b. vim 用 syntastic
https://github.com/scrooloose/syntastic
c. checkbashisms も使用してチェック duggan/shlint GitHub
https://github.com/duggan/shlint
□G. 前スレ
1. ☆シェルスクリプトを勉強するにあたって☆
http://hibari.2ch.net/test/read.cgi/unix/989659936/
2. 便利なシェルスクリプト見せろ
http://pc.2ch.net/test/read.cgi/unix/996949546/
3. シェルスクリプト総合 その1
http://pc5.2ch.net/test/read.cgi/unix/1101820646/
中略。検索して下さい
4. シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0009テンプレ ◆01VkPKFOHeoR
2014/11/11(火) 03:46:48.401. sed
http://peace.2ch.net/test/read.cgi/unix/1085730992/
2. 正規表現
http://peace.2ch.net/test/read.cgi/unix/1039165754/
3. Regular Expression(正規表現) Part13
http://peace.2ch.net/test/read.cgi/tech/1415149975/
4. Perlについての質問箱 63箱目
http://peace.2ch.net/test/read.cgi/tech/1392906213/
5. ECMAScript デス 4
http://peace.2ch.net/test/read.cgi/tech/1325448978/
6. Rubyについて Part49
http://peace.2ch.net/test/read.cgi/tech/1382307475/
7. Pythonのお勉強 Part50
http://peace.2ch.net/test/read.cgi/tech/1413474092/
8. 【node.js】サーバサイドjavascript 2【Rhino】
http://peace.2ch.net/test/read.cgi/tech/1358937029/
□I. 現在評価待ち: X.n は予定した追加先。主にスレ立て人の判断保留用。
0010テンプレ ◆01VkPKFOHeoR
2014/11/11(火) 03:47:27.081. 検索しやすい様に、先頭に "コメント複数行\n指示\n□X" を付けて指定して下さい。
追加や、削除、挿入、移動、分割等と適切に書いて下さい。
900 レスまでに別の方の反論が無ければ、次にスレッドを立てる人が適当に判断して
取り込むはずです。
2. レス例
スクリプトスレを列挙するのは不要に感じる
削除
□H. 関連スレ
H.5から8 ECMAScript, Rubyについて, Pythonのお勉強, サーバサイドjavascript
3. レス例
これは、聖なる本
追加
□E. 学習用テキスト
4.お勧め図書
a 伝承シェルプログラミング ( 199X年 )
http://www.example.net/404.html
| テンプレートの変更案や、お勧めのリンク、本等が有りましたら、
V あ、張り切って〜、どうぞ〜! 案じゃ無くてつぶやきでも、どうぞ〜!
0011名無しさん@お腹いっぱい。
2014/11/12(水) 04:59:38.710012名無しさん@お腹いっぱい。
2014/11/12(水) 07:18:57.540013名無しさん@お腹いっぱい。
2014/11/12(水) 13:25:09.66コート脱いだらハワイのミポリソ萌えスクリプトが
サーバのどっかに転がってたかもなぁw
0014名無しさん@お腹いっぱい。
2014/11/12(水) 23:08:52.17とか思ってたらしっかり記載していたでござる
なんか文面の雰囲気変わったな、もっと堅い感じだった気がするが
0015名無しさん@お腹いっぱい。
2014/11/13(木) 07:09:24.77変えてないけどなあ
意見聞く際になるべく中立、丁寧語で書いたから、そういう印象なのかな?
意見を聞いて了承を得てからという作業は面倒臭かったが
たとえ、その23 以前の短い1レスだけのテンプレのままを、立てる人がコピペするにしても
少なくとも Perl の矛盾した記述だけはなんとかしたい
シェルスクリプト総合 その1 からずっと最近までは
「(Rubyや)awkまたはperlの方が適した処理にはそちらを使いましょう。」だけだった
0016名無しさん@お腹いっぱい。
2014/11/16(日) 22:28:48.41ずっと(22年ぐらい) 自宅や学校の FreeBSD上で tcsh を login shell として使ってきましたが、
このスレを読んで、 csh 系スクリプトはお勧めでないことを知りました。
root で作業するときには、 sh も必要なので使いますし、スクリプトも書くのですが
tcsh から sh系に移行できないでいます。
最近は仕事で数値計算をするときのプラットフォームが cygwin になってしまったため、
これを機に 自宅の FreeBSD でも、sh 系を login shell にするように切り替えようかとも思っています。
お勧めを教えて頂けませんでしょうか。
どうぞ宜しくお願い致します。
0017名無しさん@お腹いっぱい。
2014/11/16(日) 22:34:23.69すみません。他に適切と思われるスレを見つけたので、移動します。
おまえら! shell は何を使っているんですか?
http://peace.2ch.net/test/read.cgi/unix/1012330865/
お邪魔して申し訳ありませんでした。
0018名無しさん@お腹いっぱい。
2014/11/17(月) 00:19:12.190019名無しさん@お腹いっぱい。
2014/11/17(月) 06:46:29.310020名無しさん@お腹いっぱい。
2014/11/17(月) 08:15:15.500021名無しさん@お腹いっぱい。
2014/11/17(月) 08:20:16.990022名無しさん@お腹いっぱい。
2014/11/17(月) 08:52:41.490023名無しさん@お腹いっぱい。
2014/11/17(月) 14:56:35.930024名無しさん@お腹いっぱい。
2014/11/17(月) 22:07:53.320025名無しさん@お腹いっぱい。
2014/11/18(火) 13:45:16.57いやなんとなく続けてるだけか
0026名無しさん@お腹いっぱい。
2014/11/18(火) 17:45:34.74実体が ash だったり
dash へのリンクだったりするだけでw
0027名無しさん@お腹いっぱい。
2014/11/18(火) 17:50:06.98スクリプト書く労力は他のシェルでもあんま変わらんでしょ?
0028名無しさん@お腹いっぱい。
2014/11/18(火) 18:04:52.35補完なし、ヒストリーなし、aliasなしで。
0029名無しさん@お腹いっぱい。
2014/11/18(火) 18:09:15.900030名無しさん@お腹いっぱい。
2014/11/18(火) 18:24:14.49という話から来てるから、
ログインシェルの話だろ
0031名無しさん@お腹いっぱい。
2014/11/19(水) 20:36:46.430032名無しさん@お腹いっぱい。
2014/11/20(木) 21:39:29.05ashはファイル補完もヒストリー呼び出しもある。
aliasなんてうんこ。functionの方が強力。
0033名無しさん@お腹いっぱい。
2014/11/21(金) 05:09:42.89それはFreeBSD拡張のashだね。
0034名無しさん@お腹いっぱい。
2014/11/21(金) 16:11:47.88ログインシェルは zsh
0035名無しさん@お腹いっぱい。
2014/11/21(金) 16:14:13.45大抵emacsのshell-modeで使うので、ヒストリやコンプリーションは
なくてもそれほど困らない。
0036名無しさん@お腹いっぱい。
2014/11/21(金) 19:51:04.450037名無しさん@お腹いっぱい。
2014/11/21(金) 19:58:39.53その状態でログインしたviからシェルエスケープしようとすると
vi変数でshell=vi状態になってるのでシェルのつもりでさらにviが起動されてハマる。
0038名無しさん@お腹いっぱい。
2014/11/21(金) 20:28:57.590039名無しさん@お腹いっぱい。
2014/11/21(金) 20:41:52.180040名無しさん@お腹いっぱい。
2014/11/21(金) 20:53:09.310041名無しさん@お腹いっぱい。
2014/11/25(火) 12:45:00.26下記の例だと「1 2 3」の順で表示されますが、これを「3 2 1」の順で表示させたいです。
VLIST="1 2 3"
for val in $VLIST
do
echo $val
done
0042名無しさん@お腹いっぱい。
2014/11/25(火) 13:00:52.50VLIST='1 2 3'
for val in `echo "$VLIST" | tac -s ' '`
do
echo "$val"
done
0044名無しさん@お腹いっぱい。
2014/11/25(火) 13:46:29.21$ for val in $(rev <<< "$VLIST"); do echo $val; done
0045名無しさん@お腹いっぱい。
2014/11/25(火) 13:56:09.140046名無しさん@お腹いっぱい。
2014/11/25(火) 13:57:16.68revだと、2桁以上の数字の時 数値の桁が入れ替わるので不可。
12 13 14 -> 41 31 21 みたいに
0047名無しさん@お腹いっぱい。
2014/11/25(火) 20:47:40.160048名無しさん@お腹いっぱい。
2014/11/25(火) 21:00:07.87GNU 方面は、他にも便利なコマンドがいろいろありそう・・・
(さすがに date コマンドで日付演算できるのは知ってた)
0049名無しさん@お腹いっぱい。
2014/11/25(火) 21:25:54.46100個ぐらいしかないんだからさ
0050名無しさん@お腹いっぱい。
2014/11/25(火) 21:53:35.67http://www.catonmat.net/blog/gnu-coreutils-cheat-sheet/
0051名無しさん@お腹いっぱい。
2014/11/26(水) 00:18:13.73しかし名前のセンスいいよな
0052名無しさん@お腹いっぱい。
2014/11/26(水) 00:36:12.960053名無しさん@お腹いっぱい。
2014/11/26(水) 06:02:33.63要素ごとにもっかいrevで
0054名無しさん@お腹いっぱい。
2014/11/26(水) 06:28:19.23やめておけよw
0055名無しさん@お腹いっぱい。
2014/11/26(水) 06:42:34.790056名無しさん@お腹いっぱい。
2014/11/26(水) 06:48:48.660057名無しさん@お腹いっぱい。
2014/11/26(水) 06:50:18.91t=; for val in $VLIST; do t="$val $t"; done
for val in $t
do
echo "$val"
done
0058名無しさん@お腹いっぱい。
2014/11/26(水) 06:51:47.260059名無しさん@お腹いっぱい。
2014/11/26(水) 07:03:58.55VLIST='1 2 3'
func()
{
if [ $# -gt 1 ]; then
(shift; func "$@")
fi
echo "$1"
}
func $VLIST
0060名無しさん@お腹いっぱい。
2014/11/26(水) 12:51:29.430061名無しさん@お腹いっぱい。
2014/11/26(水) 12:59:26.090062名無しさん@お腹いっぱい。
2014/11/26(水) 17:31:45.44即レスかっけー!これは濡れるw
0063名無しさん@お腹いっぱい。
2014/11/26(水) 19:08:42.67素直で余計なことをしていない
逆転と出力で2回forってるのが気にはなるが
0064名無しさん@お腹いっぱい。
2014/11/26(水) 20:30:20.12VLIST='1 2 3 4 5'
val=($VLIST)
while [ ${#val[@]} -gt 0 ]; do
echo ${val[${#val[@]}-1]}
unset val[${#val[@]}-1]
done
0065名無しさん@お腹いっぱい。
2014/11/26(水) 21:05:02.38どうせbash使うなら素直にこうやれよ
↓
#!/bin/bash
VLIST='1 2 3 4 5'
val=($VLIST)
for ((i=${#val[@]}-1; i >= 0; i--)) {
echo ${val[i]}
}
0066名無しさん@お腹いっぱい。
2014/11/27(木) 02:55:58.45VLIST="1 2 3"
set $VLIST
for val in $9 $8 $7 $6 $5 $4 $3 $2 $1
do
echo $val
done
0067名無しさん@お腹いっぱい。
2014/11/27(木) 03:03:45.58echo $9 $8 $7 $6 $5 $4 $3 $2 $1
でええやん…
0068名無しさん@お腹いっぱい。
2014/11/27(木) 03:42:20.68bash/zsh なら local 変数使ってこんな感じに
function reverse {
local arg="$1"
[ $# -gt 0 ] &&
{ shift; reverse "$@"; echo -n "$arg "; }
}
最後の改行はどうすべぇ…
0069名無しさん@お腹いっぱい。
2014/11/27(木) 04:05:50.71function reverse {
function _reverse {
local arg="$1"
[ $# -gt 0 ] &&
{ shift; _reverse "$@"; echo -n "$arg "; }
}
_reverse "$@" | sed 's/ $/\n/'
}
0070名無しさん@お腹いっぱい。
2014/11/27(木) 12:26:34.92もっと綺麗にならんかね
■ このスレッドは過去ログ倉庫に格納されています