シェルスクリプト総合 その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/
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もっと綺麗にならんかね
0071名無しさん@お腹いっぱい。
2014/11/27(木) 13:33:00.01毎日凝視して眺める訳じゃないから
動けばいい、安定してどんな場面でも問題が起こらなければいい。
シェルスクリプトなんてそういうレベルのもの
しょせん手作業の積み上げだからね。
0072名無しさん@お腹いっぱい。
2014/11/27(木) 14:14:44.52他人のコードをメンテしたり機能追加したことのない奴が言うセリフ
0073名無しさん@お腹いっぱい。
2014/11/27(木) 14:31:21.58一回動けばそれでいい使い捨てのスクリプトもある
それだけの話っしょ
0074名無しさん@お腹いっぱい。
2014/11/27(木) 14:32:04.950075名無しさん@お腹いっぱい。
2014/11/27(木) 14:43:04.360076名無しさん@お腹いっぱい。
2014/11/27(木) 15:06:22.08自分しか使わないマシンでも他人にメンテをお願いする
前提で書かないとならないのかい?
むしろメンテ側の人間には全く関係ない話しなんだが。
0077名無しさん@お腹いっぱい。
2014/11/27(木) 15:08:35.87一ヶ月前の自分は他人と思えって諺があってだな
個人的には自分のコードを汚く書いてしまったせいで泣くはめになったことも良くある
0078名無しさん@お腹いっぱい。
2014/11/27(木) 15:12:04.960079名無しさん@お腹いっぱい。
2014/11/27(木) 15:23:18.84良い師匠に巡り会ったじゃない。
もし1ヶ月前の自分が完全無欠なら精進の可能性を断たれるな。
0080名無しさん@お腹いっぱい。
2014/11/27(木) 17:23:22.210081名無しさん@お腹いっぱい。
2014/11/27(木) 17:40:12.560082名無しさん@お腹いっぱい。
2014/11/27(木) 18:27:07.180083名無しさん@お腹いっぱい。
2014/11/27(木) 19:50:57.590084名無しさん@お腹いっぱい。
2014/11/28(金) 00:13:06.85書いた「つもり」だからだろ
0085名無しさん@お腹いっぱい。
2014/11/28(金) 00:35:46.310086名無しさん@お腹いっぱい。
2014/11/28(金) 05:41:19.53シェルスクリプトに問題が出て治す必要があるなら
最初から書いた方が良いよ、、その時の実力で
最良のものが書ける。
1度書いた流れなら数年経っても頭に残ってるから
高速で仕上がるし、できた物を比べても大した違いは無い事も多い。
駆け出しの頃の書き物はまったく変わるのかもしれないが
それはそれで、全く変わらないと困るだろ。
過去の駄作に手をいれてジタバタしたって無駄
0087名無しさん@お腹いっぱい。
2014/11/28(金) 08:44:15.84「これこういう風に変えられない?」とか言われて白目になったことはある。
もちろん一般化できる話じゃないとは思うけど。
0088名無しさん@お腹いっぱい。
2014/11/28(金) 12:08:04.77echo "1^M2"で2しか表示されません何故ですか?
echo "1\r2"もそうでした
echo "1\n2"はちゃんと改行されて1と2が表示されました
^M \r \nってどう使い分けるものですか?
^MはCTRL+V CTRL+Mで入力しました
0089名無しさん@お腹いっぱい。
2014/11/28(金) 12:22:58.74\nと^Jは同じでLF。
CRとLFの違いは自分で調べろ。
0090名無しさん@お腹いっぱい。
2014/11/28(金) 12:35:54.36LFは低周波であることはわかりましたが、
そこから先がわかりません、よろしく女教授ください。
0091名無しさん@お腹いっぱい。
2014/11/28(金) 12:50:56.72CRとLFやタブストップなどは
機械式タイプライター由来なので、一度現物を見れば忘れない
ヤフオクで1000円くらいで手に入るから買ってみるといいよ
私女だけど
0092名無しさん@お腹いっぱい。
2014/11/28(金) 13:03:16.650093名無しさん@お腹いっぱい。
2014/11/28(金) 13:54:56.36Linuxは0xJで改行、BSDは0xMで改行しますよね。
どうしてこういう違いができたんでしょう?
簡単に返還する方法はありますか?
0094名無しさん@お腹いっぱい。
2014/11/28(金) 14:34:44.34これってHP依存コマンドだっけ?
0095名無しさん@お腹いっぱい。
2014/11/28(金) 14:46:02.61ある
ちょっとは調べろよ
0096名無しさん@お腹いっぱい。
2014/11/28(金) 15:13:15.53改変コピペにかまうな
009788
2014/11/28(金) 20:10:29.27例えば
a<CR>
b<CR>
だったらbしか表示されないってことですか?
0098名無しさん@お腹いっぱい。
2014/11/28(金) 20:11:01.930099名無しさん@お腹いっぱい。
2014/11/28(金) 20:12:58.92http://ja.wikipedia.org/wiki/%E3%82%AD%E3%83%A3%E3%83%AA%E3%83%83%E3%82%B8%E3%83%BB%E3%83%AA%E3%82%BF%E3%83%BC%E3%83%B3
この辺の話ね。
0100名無しさん@お腹いっぱい。
2014/11/28(金) 20:20:08.060101名無しさん@お腹いっぱい。
2014/11/28(金) 20:30:52.68組み込みでもCR改行の場合がある。
LFで良いだろうぜぇ…といつも思うわ
0102名無しさん@お腹いっぱい。
2014/11/28(金) 21:00:51.140103名無しさん@お腹いっぱい。
2014/11/28(金) 21:47:52.95>>102に許可が射るのか?
0104名無しさん@お腹いっぱい。
2014/11/28(金) 22:03:40.21その次に通る道はBOM…だったけど最近はWindows触ってないから今どうなってるのか分からん
0105名無しさん@お腹いっぱい。
2014/11/28(金) 22:38:41.11こんな反応じゃダメ?
0106名無しさん@お腹いっぱい。
2014/11/28(金) 23:06:22.07HTMLはWindowsで作ってるらしくgrepとsedで抽出したあとCRのごみがついてることに気がついた
なのでCR削除したんだけどsambaで共有してるディレクトリに置いていたファイルを
メモ帳で開くことがあってまたぐちゃぐちゃに、まあTeraPadとかで開けばいいんだけど
環境に依存してしまうので再度CRくっ付けて解決したな
0107名無しさん@お腹いっぱい。
2014/11/28(金) 23:11:48.200108名無しさん@お腹いっぱい。
2014/11/28(金) 23:48:34.230109102
2014/11/29(土) 00:39:08.93そのあたりから定期的に張られる改変コピペだろうと思っただけなんだが
今回やたらみんな親切だから気になっただけだ
0110名無しさん@お腹いっぱい。
2014/11/29(土) 00:48:29.810111名無しさん@お腹いっぱい。
2014/11/29(土) 01:05:04.710112名無しさん@お腹いっぱい。
2014/11/29(土) 01:37:27.481\r2
0113名無しさん@お腹いっぱい。
2014/11/29(土) 01:49:55.580114名無しさん@お腹いっぱい。
2014/11/29(土) 01:50:33.860115名無しさん@お腹いっぱい。
2014/11/29(土) 06:46:31.93おそらくいつものコピペ荒らし
http://peace.2ch.net/test/read.cgi/unix/1413122189/276
0116名無しさん@お腹いっぱい。
2014/11/29(土) 09:29:20.23その後誘導されてこっちに移動してきた
0117名無しさん@お腹いっぱい。
2014/11/29(土) 10:00:47.020118名無しさん@お腹いっぱい。
2014/11/29(土) 10:56:38.770119名無しさん@お腹いっぱい。
2014/11/29(土) 11:00:44.61これいやらしくて自分も引っかかったんだけど
>>112はshで目的の動作をしてbashだとだめなんだよな
自分はシェルがbashでスクリプトはshなんだけど
実行結果が違うから引っかかって結構悩んだ
0120名無しさん@お腹いっぱい。
2014/11/29(土) 12:05:12.750121名無しさん@お腹いっぱい。
2014/11/29(土) 12:07:01.300122名無しさん@お腹いっぱい。
2014/11/29(土) 12:12:50.640123名無しさん@お腹いっぱい。
2014/11/29(土) 12:27:45.780124名無しさん@お腹いっぱい。
2014/11/29(土) 13:00:19.16printfを使うか>>114のように展開するのがいいみたいね
https://fumiyas.github.io/2013/12/08/echo.sh-advent-calendar.html
http://mattintosh.hatenablog.com/entry/2013/12/11/201503
0125名無しさん@お腹いっぱい。
2014/12/04(木) 14:50:44.760126名無しさん@お腹いっぱい。
2014/12/05(金) 07:55:18.64http://stackoverflow.com/questions/15461737/how-to-execute-xpath-one-liners-from-shell
http://stackoverflow.com/questions/4680143/how-to-parse-xml-using-shellscript
0127名無しさん@お腹いっぱい。
2014/12/07(日) 12:25:15.01現在下記のようなシェルスクリプトを書いています。
trap 'echo "ERROR!!" ; exit 1' ERR
hoge 2>&1 | tee test.log
hoge2 2>&1 | tee test.log
hoge3 2>&1 | tee test.log
hoge4 2>&1 | tee test.log
コマンド結果の標準出力と標準エラー出力の両方を
ログファイルに残したいのですが
この場合、最初のコマンドで戻り値に1が返されても
次のteeコマンドで戻り値が0になってしまうため
trapで適切にエラーハンドリングできない状態です。
pipestatus使えば何とかなりそうなのですが
その場合コマンドを実行するたびにif文で
pipestatusを評価する必要があるため、冗長に感じてしまいます。
そのためもしより良い解決方法がありましたらご教授いただけませんか。
0128名無しさん@お腹いっぱい。
2014/12/07(日) 12:45:10.31err_and_exit () {
trap 'echo "ERROR!!" ; exit 1' ERR
eval "$@"
}
err_and_exit 'hoge' 2>&1 | tee test.log
0129名無しさん@お腹いっぱい。
2014/12/07(日) 13:35:25.85全部まとめて tee して、コマンドは && でつなげばエラーがあれば途中で打ち切ってくれるよ。
( hoge && hoge2 && hoge3 && hoge ) 2>&1 | tee test.log
0130129
2014/12/07(日) 13:37:42.00( hoge && hoge2 && hoge3 && hoge4 ) 2>&1 | tee test.log
0131名無しさん@お腹いっぱい。
2014/12/07(日) 17:01:01.110132名無しさん@お腹いっぱい。
2014/12/07(日) 17:03:41.55#!/bin/bash
exec > >(tee test.log) 2>&1
trap 'echo "ERROR!!" ; exit 1' ERR
hoge
hoge2
hoge3
hoge4
■ このスレッドは過去ログ倉庫に格納されています