[過去ログ] シェルスクリプト総合 その26 [無断転載禁止]©2ch.net (902レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1(1): 名無しさん@お腹いっぱい。 [sage] 2017/03/20(月) 12:07:26 AAS
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。
bash/zsh/ksh/ashなどに依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。
外部リンク:src.illumos.org
外部リンク[html]:heirloom.sourceforge.net
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆーな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
2chスレ:unix
878: 名無しさん@お腹いっぱい。 [sage] 2018/04/18(水) 23:55:18 AAS
a="$(printf '1\n\n\n')"
とやってもaには1しか入っていない
a="$(printf '1\n\n\n2')"
しかしこうすると5バイト入ってる
その状態から a=${a%?} を末尾の2を削除すると
a には4バイト、1\n\n\n が入っている
うーん?
879: 名無しさん@お腹いっぱい。 [] 2018/04/19(木) 00:06:08 AAS
>>877877(1): 名無しさん@お腹いっぱい。 [sage] 2018/04/18(水) 23:47:33 AAS
echo "1 + 2" | bc > /tmp/a
とすると/tmp/aには2バイト、16進数で
33 0a のデータが入っています。
a=$(echo "1 + 2" | bc)
printf "$a" > /tmp/a
しかしこうすると$aには1バイトしか入ってないようです。
また [ "$(printf '1')" = "$(printf "1\n\n\n\n\n")" ]
これは一致した文字とみなされるようです
こういった挙動はどこを見れば理解できるでしょうか?
コマンド置換 $(...) の仕様
外部リンク[html]:pubs.opengroup.org
> removing sequences of one or more <newline> characters at the end of
> the substitution. Embedded <newline> characters before the end of
> the output shall not be removed; however, they may be treated as
> field delimiters and eliminated during field splitting, depending on
> the value of IFS and quoting that is in effect. If the output
> contains any null bytes, the behavior is unspecified.
bashのマニュアルにも同様の記述がある
外部リンク[html]:linuxjm.osdn.jp
> bash は command を実行し、 command の標準出力でコマンド置換の部分を
> 置き換えます。この際、末尾の改行文字は削除されます。 文字列の途中に
> ある改行文字は削除されませんが、 単語分割の際に削除されることがあり
> ます。
880: 名無しさん@お腹いっぱい。 [sage] 2018/04/19(木) 00:06:21 AAS
かといってこうやると4バイトでてるんだよなー
printf '1\n\n\n' | hexdump.exe -C
881: 名無しさん@お腹いっぱい。 [sage] 2018/04/19(木) 00:19:37 AAS
コマンド置換の仕様かぁ
普通のやり方ではコマンドの出力結果を変数に入れるときは
末尾の改行は絶対消えるってことかなー
read使えばって思ったけど、あっちは改行区切りだしなー
ちなみに $aに1\n\n\nを無理やり入れて、
$bに1を入れて [ "$a" = "$b" ] で比較したら不一致になったよ
882: 名無しさん@お腹いっぱい。 [sage] 2018/04/19(木) 00:24:31 AAS
あたりまえやろw
883: 名無しさん@お腹いっぱい。 [sage] 2018/04/19(木) 00:54:10 AAS
よくこんな単純なルールで辻褄取れてるよなー
思いつきで考えたとしか思えないルールなのにw
884: 名無しさん@お腹いっぱい。 [sage] 2018/04/24(火) 02:26:08 AAS
単純なルールのほうが整合性は取りやすいんでは? 寧ろ複雑な規則だと実装に矛盾が生じたりしそう。
885(1): 名無しさん@お腹いっぱい。 [] 2018/04/27(金) 23:17:19 AAS
ちょっと質問
偶数日と奇数日で処理を分けたいんだけど、上手くできない
どうしたら良いのかアドバイスください
#!/bin/sh
DATE=`date '+%d'` # 日 を取得
buf=$(( $DATE % 2 )) # 計算
if [ ! $buf ]; then # 偶数
hoge
else # 奇数
fuga
fi
886(2): 名無しさん@お腹いっぱい。 [sage] 2018/04/27(金) 23:43:49 AAS
その計算するとこ()の中に$いるっけ
887(1): 名無しさん@お腹いっぱい。 [sage] 2018/04/28(土) 00:55:01 AAS
>>885
#! /bin/sh -
DATE="$(date "+%d")"
if [ $((DATE % 2)) -eq 0 ]; then
echo "今日は偶数Day"
else
echo "今日は奇数Day"
fi
ある種の言語(Cとかだっけ?)はif文に0を放り込めるけど、
コマンドを逐次実行するだけのシェルスクリプトでは無理。
面倒だけど数値判定をしなきゃいけない。
あと、>>886氏の言う通り演算置換内の変数に弗記号は不要。
あと、コマンド置換は容易く入れ子にできて対も分かりよい$()を使おう。
POSIX sh 2003でもサポートされているので安心して。
888(1): 名無しさん@お腹いっぱい。 [sage] 2018/04/28(土) 01:37:16 AAS
BSDで標準コマンドだけで現在時刻(もしくは起動してからの)ミリ秒ってとれないのな
/proc/uptimeもBSDないみたいだしどうにかして取れないかなー
ファイルに書き込んでタイムスタンプで
取れないかなーとかもやってみたりもしたw
ファイルシステムによっては書き込まれるみたいだが
これも標準コマンドだけでどうやればー
できればなにも入ってない素のコマンドだけでやりたいんだよね
Perlでもやれるけど、dateコマンドに比べたら
起動時間が10倍も違うんだよな。
あ、ベンチマークというかコマンドの実行速度を細かく知りたいために使いたい。
timeコマンドは標準出力(エラーだっけ?)を乱すので使いたくない
889: 名無しさん@お腹いっぱい。 [sage] 2018/04/28(土) 01:49:17 AAS
あれとれなかったっけ?
なんか取れた気がしたけど気のせいだったか
890: 名無しさん@お腹いっぱい。 [] 2018/04/28(土) 19:41:21 AAS
>886-887
ありがとうできたよ。bufが空白になって常にelseに倒れてたから助かりました。
$の位置が良くわからなくて困っていたんだ
Cならいくらでも書けるんだけど、慣れない言語はちょとね・・・
891(1): 名無しさん@お腹いっぱい。 [sage] 2018/04/28(土) 20:34:44 AAS
>>888
timeコマンドの出力は標準エラーだよ。
標準出力の方は乱さない。
標準エラーが乱れる方も
(time sh -c '測りたいコマンド 2>&3' 2>/tmp/time.out ) 3>&2
みたいにすれば回避できるから、素直に time コマンド使う方がいい。
892: 名無しさん@お腹いっぱい。 [sage] 2018/04/28(土) 23:27:39 AAS
>>891
もう一つ問題があってなぁ。
dashじゃtimeコマンドビルトインじゃないんだよ
ビルトインじゃないからシェル関数で使えないんだよね
893: 名無しさん@お腹いっぱい。 [sage] 2018/04/29(日) 00:02:10 AAS
まあ使えないわけじゃないし候補にはなるけど、
OSごとに処理分けるの嫌だなぁ
894: 名無しさん@お腹いっぱい。 [sage] 2018/04/29(日) 00:07:48 AAS
/bin/timeって明示すれば?
895: 名無しさん@お腹いっぱい。 [sage] 2018/04/29(日) 02:10:30 AAS
もしくは
command -p time
896: 名無しさん@お腹いっぱい。 [sage] 2018/04/29(日) 08:34:10 AAS
いや、だからtimeコマンドだと
シェル関数扱えないからだめだって言ってるやん?
897: 名無しさん@お腹いっぱい。 [sage] 2018/04/29(日) 11:24:09 AAS
放置で
898: 名無しさん@お腹いっぱい。 [sage] 2018/04/29(日) 18:50:59 AAS
どうぞ
899: 名無しさん@お腹いっぱい。 [sage] 2018/04/30(月) 09:52:20 AAS
mkfifo便利すぎる
900(2): 名無しさん@お腹いっぱい。 [] 2018/04/30(月) 10:17:56 AAS
シェルスクリプトの入門書を教えてください
ソフトバンクから出てるUNIXシェルスクリプト〜みたいな書名のものがAmazonでは評価高いみたいなんですが…
先輩方のおすすめを教えてください
901(1): 名無しさん@お腹いっぱい。 [] 2018/04/30(月) 14:27:06 AAS
>>900
こういう分野に関してはいまだにオライリーは信頼できる書籍を発行してるぜ。
まあ俺の持論だがw
外部リンク:www.oreilly.co.jp
↑これとか参考になる。コマンドの列挙だけじゃなく、システムとシェルの性質とか非常に基礎的な部分から触れてるのでよい(と思う)。
902: 900 [] 2018/04/30(月) 16:27:23 AAS
>>901
>システムとシェルの性質とか
これ正に知りたいことです
連休中本屋さん行くので是非中身読んで検討します
ありがとうございます
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.188s*