シェルスクリプト総合 その25©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2015/08/14(金) 23:42:01.51□お約束
・特記なき場合は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.illumos.org/source/xref/illumos-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
0449名無しさん@お腹いっぱい。
2016/02/06(土) 17:24:54.450450名無しさん@お腹いっぱい。
2016/02/06(土) 18:52:59.16bashがbshのマネをする変なスクリプトたがら推奨しない。
0451名無しさん@お腹いっぱい。
2016/02/06(土) 18:54:27.39スクリプトの種類を名乗る
0452名無しさん@お腹いっぱい。
2016/02/06(土) 19:55:26.03バッドノウハウ使いの老害は早く死んで欲しい
0453名無しさん@お腹いっぱい。
2016/02/06(土) 20:35:47.850454名無しさん@お腹いっぱい。
2016/02/06(土) 21:23:44.470455名無しさん@お腹いっぱい。
2016/02/07(日) 04:25:51.93/usr/binと/binは基本的に一緒だが、環境によっては違うんじゃないの?
0456名無しさん@お腹いっぱい。
2016/02/07(日) 12:45:47.230457名無しさん@お腹いっぱい。
2016/02/07(日) 18:02:30.900458名無しさん@お腹いっぱい。
2016/02/07(日) 19:26:38.34/binと/sbinはシンボリックリンクで残ってる
0459名無しさん@お腹いっぱい。
2016/02/08(月) 08:20:49.74pythonなぞいらなくなる
0460名無しさん@お腹いっぱい。
2016/02/08(月) 10:14:57.970461名無しさん@お腹いっぱい。
2016/02/08(月) 10:31:10.92おっさんの可能性もある。
0462名無しさん@お腹いっぱい。
2016/02/08(月) 10:49:58.880463名無しさん@お腹いっぱい。
2016/02/08(月) 12:25:26.78幅が広けりゃいいんでしょ的なやっつけフォントや固定幅フォントを使って表示してると
バランスが悪いのでそうなる
0464名無しさん@お腹いっぱい。
2016/02/08(月) 12:34:34.64裸の王様だからかな
0465名無しさん@お腹いっぱい。
2016/02/08(月) 13:02:09.16実際には、実行するコマンドラインを指定するもの
以下、補足
例えばこのスクリプトで試すと
$ cat ~/src/test/script
#!../bin/echo "hoge"
'fuga'
$ pwd
/usr
$ ~/src/test/script 'arg 1' "arg 2"
"hoge" /home/anonymous/src/test/script arg 1 arg 2
上では、結果的に
相対パス/echo "hoge" 引数0 引数1 引数2
が実行された結果が印字されている
普通に #!/bin/sh なスクリプトだと、結果的に実行されるのは次
/bin/sh path/to/スクリプト名 引数1 引数2 ...
0466名無しさん@お腹いっぱい。
2016/02/08(月) 13:23:29.92shebangが種類を名乗るって何のこと?
そのスクリプトを処理するインタプリタを(引数込みで)指定する
以外の説明みたことないけど
0467名無しさん@お腹いっぱい。
2016/02/08(月) 15:38:21.12>>449 !/usr/bin/shと書いてシェルスクリプトを名乗るのか。
>>451 スクリプトの種類を名乗る
>>465 shebang 行は、種類を名乗るといえば名乗っているけれど、
0468名無しさん@お腹いっぱい。
2016/02/08(月) 17:11:40.36#!/usr/bin/bash -x
とかね。
0469名無しさん@お腹いっぱい。
2016/02/08(月) 20:55:16.08それなら俺もお前も大体の奴が知ってる。
0470名無しさん@お腹いっぱい。
2016/02/08(月) 23:06:27.570471名無しさん@お腹いっぱい。
2016/02/09(火) 00:18:04.86curlで、サーバに置いてあるファイルを削除したいのですが、
curl -Q "DELE a.txt" host.sample.com
curl -Q 'DELE a.txt' host.sample.com
これだと動きました。
スクリプトで回したいときなどで変数に格納した場合で、
string="-Q 'DELE a.txt'"
curl ${string} host.sample.com
これだと、-Q以降の「 ”〜〜〜” 」で囲われた引数が伝わらないようで、動きませんでした。
> DELE
< 501 Invalid number of arguments
と返答がありました。
「"」そのものや「'」を変数で伝えるのは、一般的にどのように記述すればよいでしょうか。
記号で検索しても、なかなか情報が出ず、ヒントをお願いできればと思います。
0472名無しさん@お腹いっぱい。
2016/02/09(火) 02:34:23.06curl "-Q 'DELE a.txt'" host.sample.com
ってことじゃん。
コマンドオブションが引数扱いってわけですね。
0473名無しさん@お腹いっぱい。
2016/02/09(火) 06:18:16.59eval curl ${string} host.sample.com
あるいは
set x -Q 'DELE a.txt'
shift
curl "$@" host.sample.com
0474名無しさん@お腹いっぱい。
2016/02/09(火) 06:31:19.45とりあえず貼っておく
eval を使う
展開されたくない所は、何も考えずにシングルクォートしておく
$ set -vx #とりあえずデバッグ用に
$ opt471="-Q 'DELE a.txt'"
$ sh -c 'for arg; do echo "$arg"; done' parseArgs ${opt471} #質問時の状態
$ eval 'sh -c '\''for arg; do echo "$arg"; done'\'' parseArgs '${opt471}
set も使う
$ eval set -- ${opt471}
$ sh -c 'for arg; do echo "$arg"; done' parseArgs "$@"
bash の配列を使っても良い
$ opt471=(-Q 'DELE a.txt')
$ bash -c 'for arg; do echo "$arg"; done' parseArgs "${opt471[@]}"
0475名無しさん@お腹いっぱい。
2016/02/09(火) 12:13:30.71autoconf では set x ...; shift をすすめている
少し訂正
eval の際のクォートが抜けていた。連続した空白等で違いが出る
sh -c だと見難いので、function で書きなおした
$ parseArgs () { i=0; for arg; do echo "arg[$((i+=1))]: $arg"; done; }
$ opt471="-Q 'DELE (spaces) a.txt'"
$ eval parseArgs "${opt471}"
$ eval set -- "${opt471}"
$ parseArgs "$@"
ついでにIFS を使うもの
$ LF='
'
$ opt471='
-Q
DELE a.txt
'
$ IFS=$LF; parseArgs $opt471 'another option' 'more...'
0476名無しさん@お腹いっぱい。
2016/02/09(火) 17:36:27.79>>472-475
たくさんの方法を、ありがとうございます!
のちほど実験してみます。
0477名無しさん@お腹いっぱい。
2016/02/09(火) 19:11:23.150478名無しさん@お腹いっぱい。
2016/02/09(火) 20:55:40.83curl -Q "$*" host.sample.com
を関数かスクリプトにするかなぁ
単独でも使えそうだし
0479名無しさん@お腹いっぱい。
2016/02/09(火) 23:45:01.02結局の所
変数からクォートを考慮して単語分割するには、eval を使う
配列(もどき)に入れるには set か val=(...) もしくは改行区切り等
eval 無しだと、sed perl ruby 辺りで自力で単語分割
簡単なものなら xargs も使えるか
0480名無しさん@お腹いっぱい。
2016/02/11(木) 07:29:09.80cu -l /dev/ugen0.2 > 160211.log
のコマンドを開始し、
23時間後の午前0時に停止する、というシェルスクリプトを作りたいと思っています。
ログファイルの名前は午前1時の時点の日付が入ります。
ここで質問なのですが、
指定した時刻でコマンド(cu)の起動、停止をするにはどうすれば良いのでしょうか?
OS:FreeBSD10.2-RELEASE
シェル:sh
です。
0481名無しさん@お腹いっぱい。
2016/02/11(木) 09:25:45.48cronやat
0482名無しさん@お腹いっぱい。
2016/02/11(木) 13:08:07.53ありがとうございます!!
これで幸せになれます!!
0483480
2016/02/12(金) 08:51:56.08結局、
・起動はcron
・cuからminicomに変更
・minicomのソフト改造
・ログファイルを設定なしで保存するように改造
・時間を見て終了するように改造
・タイムスタンプを設定なしでつけるように改造
で落ち着きそう。
うーんせっかくの有休だが、午前中はFreeBSDになりそうだ。
0484名無しさん@お腹いっぱい。
2016/02/12(金) 09:40:24.870485名無しさん@お腹いっぱい。
2016/02/12(金) 09:42:07.41うろ覚えだけど
0486名無しさん@お腹いっぱい。
2016/02/12(金) 10:21:20.12それをcronから呼び出したらどうかな
起動する時はrun_cu start、停止する時はrun_cu stopみたいな形で
で、起動する時に
cu -l /dev/ugen0.2 > 160211.log &
echo $! > /var/run/lock/run_cu.lock
とやっておいて、停止するときは
kill -HUP $(cat /var/run/lock/run_cu.lock)
みたいにすれば(要するに/etc/init.dにあるデーモンの起動スクリプトみたいな感じ)
0487名無しさん@お腹いっぱい。
2016/02/12(金) 11:56:41.13スクリプトでプロセスIDが調べられないとかじゃないよね?
あとユーザが違っててrootのプロセスkillしようとしてるとか?
0488名無しさん@お腹いっぱい。
2016/02/12(金) 13:36:32.980489480
2016/02/12(金) 20:39:39.88minicomの改造と、ログファイルの処理ソフト作るのに丸一日かかった。
1日vi使ってたから2chに書き込むのもj,k,l,hでカーソル移動したくなる。
>>484>>487>>488
うん・・・。できたり、できなかったり。
なんかcu -l /dev/ttyU0 > /unko/tinko/manko/log.txtを実行して、
ps ax | grep cu | grep -v grep
で、2つ出てきたり、出てこなかったり。
で、2つ出る場合には片方をkillしようとするとそんなプロセスないとか言われたり。
なんかもう、良く分からなくて投げ出しました。
>>485
SIGHUP知りませんでした。
minicomのソースの終了処理の中に
SIGHUPなんちゃらと書いてあったので、多分それが正解ですね。
いやぁ、SIGHUPで四苦八苦しました。
>>486
それスマートですね。私が作ったやつよりもw
ただ、まぁ、minicom使ったことでタイムスタンプ入れれたので、良しとします。
0490480
2016/02/12(金) 20:42:48.13Xbeeってやつに温度センサーをつないで、無線で親機のXbeeに飛ばして、
親機からPCにシリアルで温度センサーの値を送信するシステムです。
で、ログファイルをsambaにおいておいて、別のPCから見る感じです。
テスト用に温度センサーは1個ですが、部屋中に設置する予定です。
0491名無しさん@お腹いっぱい。
2016/02/13(土) 00:30:17.310492名無しさん@お腹いっぱい。
2016/02/13(土) 02:17:17.74pkillでできなかったの?
0493名無しさん@お腹いっぱい。
2016/02/13(土) 02:27:10.99やり方はループするなりsleepで間隔あけたりまちまちだけど
以下cuのマニュアルだけど仕様を理解するって大事だね
> リ モートシステムとの間でコネクションが設定された場合、 cu
> は 2 プロセスを fork します。1 プロセスは、ポートからの デ
> ー タ読みだしと端末へのデータ書き込みを行ない、もう 1 プロ
> セスは、端末からのデータ読み出しとポートへのデータ書き込み
> を受け持ちます。
0494名無しさん@お腹いっぱい。
2016/02/13(土) 21:20:59.35次のような記述のとき、
この%はどのように解釈したらいいのでしょうか?
OLDPATH=(../help/me)
NEWPATH = $(OLDPATH:../%=./%_fuga)
文字列置換に使う場合と違うようですし、
調べても文字列置換以外に定義がでてきませんでした。
よろしくお願いします。
0495名無しさん@お腹いっぱい。
2016/02/13(土) 22:07:33.70[user@f23 ~]$ OLDPATH=(../help/me)
[user@f23 ~]$ NEWPATH = $(OLDPATH:../%=./%_fuga)
bash: OLDPATH:../%=./%_fuga: そのようなファイルやディレクトリはありません
bash: NEWPATH: コマンドが見つかりませんでした...
0496名無しさん@お腹いっぱい。
2016/02/13(土) 22:26:10.26より
${parameter%word}
${parameter%%word}
パターンに後方一致した部分を取り除く。 word が展開され、パス名展開の場合と同じようなパターンを作ります。
このパターンが parameter を展開した値の末尾の部分とマッチする場合、展開結果は parameter を展開した値から
最短一致パターン (``%'' の場合) または最長一致パターン (``%%'' の場合) を取り除いたものになります。 parameter
が @ または * である場合、 パターンを削除する操作は全ての位置パラメータに順番に適用され、 展開結果はリストとして
得られます。 parameter が @ または * が添字になっている配列変数である場合、 パターンを削除する操作は配列の全て
の要素に順番に適用され、 展開結果はリストとして得られます。
$()じゃなくて${}だんべな。
私は良くわかんない。後は詳しい人にまかせた。
0497名無しさん@お腹いっぱい。
2016/02/13(土) 22:38:34.46なんでOLDPATH=の閉じカッコを半角に、そこだけ改変しちゃったの?
0498名無しさん@お腹いっぱい。
2016/02/14(日) 00:07:40.09どこでそういう記述を見つけたのかな
0499名無しさん@お腹いっぱい。
2016/02/14(日) 04:49:47.490500名無しさん@お腹いっぱい。
2016/02/14(日) 06:05:22.06例示を見直して提示し直さない限り、どうにもならんな
0501名無しさん@お腹いっぱい。
2016/02/14(日) 08:13:57.65金払って仕事してもらえ
0502名無しさん@お腹いっぱい。
2016/02/14(日) 09:11:58.95という相対パスで指定されたファイルを実行し、その結果の前に=をおいてNEWPATHというコマンドを実行する
0503名無しさん@お腹いっぱい。
2016/02/14(日) 14:58:59.31Makefile 全体とは言わんがもっと前後貼れよ
0504名無しさん@お腹いっぱい。
2016/02/15(月) 05:51:37.58ここを釣り堀にする奴がいるとは思わなかったwww
そういえば Makefile を書いている時は似てるなあって思ったな
0505503
2016/02/17(水) 23:08:47.15釣りだったってことかな。 イコールの前後に空白いれたり入れなかったりだったし。
一応 make/Makefile での動作例。
$ cat Makefile
OLDPATH = ( ../datadir1 ../datadir2 )
NEWPATH = $(OLDPATH:../%=../%_fuga)
all:
@echo "$(NEWPATH)"
$ make
( ../datadir1_fuga ../datadir2_fuga )
%の使い方は
http://quruli.ivory.ne.jp/document/make_3.79.1/make-jp_5.html
の 6.3.1節を参照しました。
0506名無しさん@お腹いっぱい。
2016/02/23(火) 08:45:41.830 #!!!
BASH4.2 $> echo $((1 != 2))
1 #!!!
BASH4.2 $> a=0
BASH4.2 $> echo $a
0
BASH4.2 $> echo $((a++))
0 #?
BASH4.2 $> echo $((a++))
1
BASH4.2 $> echo $((a++))
2
BASH4.2 $> echo $((a++))
3
BASH4.2 $> echo $((a--))
4 #!!!!
BASH4.2 $> echo $((a--))
3
0507名無しさん@お腹いっぱい。
2016/02/23(火) 10:11:09.22シェルスクリプトの真偽値の表現と後置演算子の意味くらい覚えておけ
0508名無しさん@お腹いっぱい。
2016/02/24(水) 08:11:13.700
$ a=0; echo $((++a))
1
0509名無しさん@お腹いっぱい。
2016/02/24(水) 16:41:23.490510名無しさん@お腹いっぱい。
2016/02/25(木) 07:06:49.38( ´∀`): コマンドが見つかりません
0511名無しさん@お腹いっぱい。
2016/02/26(金) 20:53:20.570512名無しさん@お腹いっぱい。
2016/02/26(金) 22:13:00.200513名無しさん@お腹いっぱい。
2016/02/26(金) 22:23:19.782
0514名無しさん@お腹いっぱい。
2016/02/26(金) 22:30:46.281
$ a=0; echo $((a+++++ +a))
1
$ a=0; echo $((a+ ++++ +a))
0
0515名無しさん@お腹いっぱい。
2016/02/27(土) 19:01:27.83$ bash -c 'a=0; echo $(( ( a++ ) + +( ++a ) ))'
2
シェルによって解釈が色々みたいだけど
$ ksh -c 'a=0; echo $((a++++++a))'
ksh: a++++++a: assignment requires lvalue
$ dash -c 'a=0; echo $((a++++++a))'
0
0516名無しさん@お腹いっぱい。
2016/02/29(月) 18:15:35.93普通のプログラミング言語のようにループして処理してたら
ぷっって笑っちゃう方?
0517名無しさん@お腹いっぱい。
2016/02/29(月) 18:57:25.920518名無しさん@お腹いっぱい。
2016/02/29(月) 19:53:29.460519名無しさん@お腹いっぱい。
2016/02/29(月) 20:08:57.21コマンドの内部でループしているのと、スクリプトのループとは速度が違うし
また記述も単純になるから、自然とそうなるだけだし
スクリプトで人を笑ったりとかはしないかな
0520名無しさん@お腹いっぱい。
2016/02/29(月) 20:36:41.530521名無しさん@お腹いっぱい。
2016/03/01(火) 12:43:43.790522名無しさん@お腹いっぱい。
2016/03/01(火) 12:55:47.44とかも笑われてるの?
0523名無しさん@お腹いっぱい。
2016/03/01(火) 13:57:23.360524名無しさん@お腹いっぱい。
2016/03/01(火) 20:21:04.65じゃ、どう書くと笑われないと思うんだ?
でも、最近はcaseで比較する事が多い。個人的に。
0525名無しさん@お腹いっぱい。
2016/03/02(水) 00:02:25.01http://www.shellcheck.net/
SC2006 Use $(..) instead of legacy `..`.
SC2003 expr is antiquated. Consider rewriting this using $((..)), ${} or [[ ]].
SC2086 Double quote to prevent globbing and word splitting.
0526名無しさん@お腹いっぱい。
2016/03/25(金) 00:25:36.80ただdeclare -Fでもsourceって関数は定義されてないようなんですがどこで定義されているかわかりますか?
0527名無しさん@お腹いっぱい。
2016/03/25(金) 01:32:44.95man source
0528名無しさん@お腹いっぱい。
2016/03/25(金) 01:59:04.54type source
0529名無しさん@お腹いっぱい。
2016/03/25(金) 02:11:33.46source is a shell builtin
$ help source
source: source filename [arguments]
Execute commands from a file in the current shell.
定義はソースコードの bash-4.3/builtins/source.def にある
source_builtin 関数
0530名無しさん@お腹いっぱい。
2016/03/25(金) 05:01:14.68ありがとうございます!
ばっちりです!
0531名無しさん@お腹いっぱい。
2016/04/02(土) 18:56:42.48ただ、そういう硬い書き方してる人のスクリプトは、bashの脆弱性が見つかった時でも
/bin/bash を /bin/ksh とかで代用できるからなんともいえん。
少なくとも i++ よりはポータブルだし
0532名無しさん@お腹いっぱい。
2016/04/08(金) 08:53:02.48ほんの数年前までそれ以外の書き方をすると怒り出す、
純正シェルジジイが粘着してたんだが、リアル墓場行ったかな。喜ばしい事だ
0533名無しさん@お腹いっぱい。
2016/04/09(土) 20:08:53.43見えたのは、2ch鯖が変わっていたせいであったかw
今頃きづいたという。。。
0534名無しさん@お腹いっぱい。
2016/04/12(火) 18:45:07.55こんどbashをやることになったのですが、シェルスクリプトの書いて覚える系のいい書籍はないでしょうか?
馬鹿なので読んだだけでは理解できないので手を動かすタイプのを教えてください。
0535名無しさん@お腹いっぱい。
2016/04/12(火) 19:26:46.24シェルプログラミング実用テクニック
0536名無しさん@お腹いっぱい。
2016/04/12(火) 20:11:06.76いろんなサイトに書き込みしても
いろいろ うるさく 叱られます。これがユニックスの流儀なんでしょうか?
とくに言われることは「スクリプトに直接関係ないこと」は書き込むな、と言うことです。
「何でも教えてくれや」「ケチケチすんなよ」「初心者には親切にせろ」
ひとことで言うと これがおれの主張です。シンプルです。
なんで?現実生活でヘイコラしてるのに、ネット上まで、ネコかぶったり
しないといけないのか?とんと理解できません。
何より、バッシュとかGシェルとか、詳しいのが、なんでエライのか?
ここが根本的にわからん。
少し誇張した部分もありますが、素直な気持ちを書きました。
0537名無しさん@お腹いっぱい。
2016/04/12(火) 20:22:51.31ありがとうございます。明日立ち読みしてみます。
>>536
あなたより大きい会社にいると思います。30前にして年収800万です。
ずっとWindowsだったのでわからないんですよね。
0538名無しさん@お腹いっぱい。
2016/04/12(火) 20:25:20.93得意分野などで教える立場になった時、同じこと思うだろうか。
0539名無しさん@お腹いっぱい。
2016/04/12(火) 20:38:02.87小さい会社だと1000越えてるのにね。
0540名無しさん@お腹いっぱい。
2016/04/12(火) 22:24:19.26おまえ Limux Mint 公式フォーラムでアラシ認定されたやつじゃね?
0541名無しさん@お腹いっぱい。
2016/04/13(水) 01:49:11.16正社員なら800でもマシな方
なんせ上が詰まっててなかなか上がらないし
でもフリーや少数精鋭のとこなら1000は余裕で行く
0542名無しさん@お腹いっぱい。
2016/04/14(木) 09:18:08.490543名無しさん@お腹いっぱい。
2016/04/14(木) 22:19:32.09サンプルコードがあるような本でも分からないなら、シェルスクリプトはやめた方がいい。
0544名無しさん@お腹いっぱい。
2016/04/14(木) 22:21:13.69「入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界」を読みなさい。
0545名無しさん@お腹いっぱい。
2016/04/15(金) 08:51:58.720546名無しさん@お腹いっぱい。
2016/04/15(金) 11:45:17.59そもそもシェルスクリプト自体が変わっていないが?
0547名無しさん@お腹いっぱい。
2016/04/15(金) 21:13:21.13さすがに絶版だったらおいおいと思うが。
0548名無しさん@お腹いっぱい。
2016/04/16(土) 00:27:13.14と言ってたら、bashの脆弱性が見つかったのは数年前だね
■ このスレッドは過去ログ倉庫に格納されています