シェルスクリプト総合 その28

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2018/07/24(火) 11:01:16.36ID:r0TJj2hB
シェルスクリプトに関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/
2018/08/29(水) 10:36:23.57ID:jDyQ3/+0
>>430
ない
432デフォルトの名無しさん
垢版 |
2018/08/29(水) 14:43:49.86ID:dthpACHL
>>414
頑張って下さい。

ま、しかし、bashだと素のshよりはちょっと楽かな?
2018/08/29(水) 14:46:35.77ID:jUkhBS20
誰か414を3行にまとめてくれ
2018/08/29(水) 14:51:01.95ID:ND6xKvzt
シェルスクリプトで引数を取り扱ういい方法はないでしょうか?
getoptとかgetoptsがあるのは知っています。
頑張ればできると思いますが、複雑になりそうです。
2018/08/29(水) 15:14:53.45ID:AXEWk4o3
getoptとかgetoptsで頑張るのがいいと思います
2018/08/29(水) 15:29:00.41ID:jUkhBS20
getoptとかgetoptsで頑張るのがいいと思います
2018/08/29(水) 16:01:13.07ID:Nn5B1KsW
getoptとかgetoptsで頑張るのがいいと思います
2018/08/29(水) 16:14:32.69ID:U+j3n810
getoptとかgetoptsで頑張るのがいいと思います
2018/08/29(水) 17:01:53.59ID:rEBrQhP5
人生、時には諦める事も必要
2018/08/29(水) 17:22:27.53ID:zGukP1bd
良いプログラマーとは、楽をする為に労力を惜しまないそうです
今回はその労力をここでの問答に費やす訳ですから
粘り強く頑張って頂ければ良いのかなと思いました
441デフォルトの名無しさん
垢版 |
2018/08/29(水) 20:56:07.12ID:zRPnCBM0
なにもしないのが一番楽
やっぱりアホしかいないわ
2018/08/29(水) 21:02:14.84ID:zfnELSlX
と、アホが申してます
2018/08/29(水) 21:41:17.05ID:ySrrhl3u
ム版に引っ越してきたばかりにム版の厄介者にいつかれちまったな
2018/08/29(水) 21:45:29.75ID:PHlZ4Qkz
ゆうめいじんなのか。なるほど
2018/08/29(水) 21:46:04.98ID:jUkhBS20
まぁIDすらなかった頃に比べれば顔真っ赤が判別できるのは助かるわ
2018/08/29(水) 23:58:23.02ID:U+j3n810
要求の多いお兄ちゃんは、結局何もしないの?
447デフォルトの名無しさん
垢版 |
2018/08/30(木) 09:43:05.13ID:Le3eFjin
しかし引数解析ってそんなに頑張らなくても自作できるよなあ。面倒なだけで。
2018/08/30(木) 09:45:01.72ID:rxoSSaq5
だから面倒なのがいやなんだろ?それぐらいわかれよ
2018/08/30(木) 09:49:03.76ID:5UlR9u+e
引数解析そのものを諦めて別の手段にするとか
2018/08/30(木) 10:11:57.74ID:lJFNKW+A
引数解析って
prog -abcde
とかもできるの?
prog -a -b -c -d
とかしかできないの?
2018/08/30(木) 10:26:46.95ID:DLN02TyK
好きに作ればよくね
2018/08/30(木) 10:57:16.78ID:8BsM3ej5
>>450
普通にできるてかしてくれる。てかそれぐらいちょっと調べればわかること
2018/08/30(木) 11:05:59.54ID:rxoSSaq5
ちょっと調べたけど
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb

ロングオプションが使えないgetoptsか
--longと書いたら-oと誤爆するgetopsしか
見つからなかった

「普通にできる」とはどういうこと?
2018/08/30(木) 11:12:04.78ID:rxoSSaq5
> --longと書いたら-oと誤爆するgetopsしか
--は先に除外すればできるか。リンク先のコードではダメだけど
あとgetopt。これはbashだから、caseの二段構成にするしかないんかな
これを「普通にできる」とは思わんけど
2018/08/30(木) 11:13:00.09ID:8BsM3ej5
getoptはGNUとBSDでは別物。GNUのはロングオプションに対応してる。誤爆って?
getoptsはKorn/POSIX シェル組み込みコマンド(らしい)。ロングオプションは使えないが>>450を「普通」にやってくれる

ロングオプションと羅列を混同してるのか??
2018/08/30(木) 11:17:10.20ID:rxoSSaq5
やっぱりデメリットあるのか。
ロングオプションが使えないのはだめだね
できるけど、べつのことができない
2018/08/30(木) 11:17:50.50ID:8BsM3ej5
なにを言いたいのだか
2018/08/30(木) 11:22:47.19ID:KGeBif2I
やはりそういうことか
2018/08/30(木) 11:24:37.49ID:rxoSSaq5
例えて言うなら、ケーキ食べられる?って聞いて
普通に食べられる(だけどパンは食べられないけどね)
みたいだなーってことだよ

確かにケーキ食べられる?が質問だし、食べられるのだろけど
それ以前のできて当然のものができないっていうのは
がっかりするしか無いなぁってこと
2018/08/30(木) 11:25:04.80ID:KGeBif2I
うん

うん?
2018/08/30(木) 11:26:42.89ID:8BsM3ej5
トンチキが横入りして勝手に俺の思ってたのと違うっていうのか。知らんがな
2018/08/30(木) 11:28:00.65ID:rxoSSaq5
こういうふうに、話の流れから当然だろ?と思うことも
いちいち全部言わないと、話ができないってのは
アスペなんだろうなって思う
2018/08/30(木) 11:30:29.24ID:8BsM3ej5
それはあんたの勝手な話の流れの解釈だな
俺は、>>450は今までとは違う初心者のぶっ込みでしかないと思うけど。ある意味新たな
てか、本題はもう終わってるだろう?あんたの勘違いでwそれを認めたくなくダラダラなだけだな
2018/08/30(木) 11:38:24.71ID:rxoSSaq5
>>463
なんか自分が初心者の質問を解決してあげたみたいに思ってるかもしれないけど、
getoptでそれができるよ(ただしロングオプションは使えないよ)って
教えてあげたのは俺だからね

あんたは普通にできるといっただけで、どうやってできるとは言ってない。
getoptという名前を出すと、すぐにロングオプションが使えないことも
わかってしまうからね。制限付きであることを隠したいから、名前を出さずに
普通にできるという言葉でごまかしたんでしょう?
2018/08/30(木) 11:52:42.25ID:TV9jsMCb
>>464
なんでそんなイライラしてるの?
2018/08/30(木) 12:05:15.24ID:rxoSSaq5
>>463がイライラしてるのが移ったんだろうさw
2018/08/30(木) 12:05:25.60ID:8BsM3ej5
>>464
解決してあげたww。次の文とかからもそこが大事なのねwなるほど
俺は別にお前のように俺が俺がというのはないなあ。単なる雑談の一種でしかないな
なので、お前のその言っていること全体がイミフメイ。妄想するのは勝手だが、妄想をダダ漏れさせてぶつけられても困ります。あとは勝手にやっとくれ
2018/08/30(木) 12:07:53.14ID:rxoSSaq5
ほらね。イライラしてるw
2018/08/30(木) 12:10:55.47ID:rxoSSaq5
雑談したいなら雑談スレに行けばいいのにね
2018/08/30(木) 12:37:21.81ID:KGeBif2I
まぁ暇なんだろ
ここでやるなには同意だが
2018/08/30(木) 12:55:18.44ID:8BsM3ej5
暇なのは否定しないが、雑談の「一種」と言っているのだけどな
すんなっていってるそれも雑談じゃないの?
2018/08/30(木) 18:15:49.30ID:43MmhEYe
>>453 >>464
都合のいい先走った解釈はされないほうが。
>>450 ではロングオプションのことはきいていないですよ。
2018/08/30(木) 19:45:19.96ID:rxoSSaq5
>>472
そんなんだからアスペって言われるんだよ
2018/08/31(金) 04:38:19.15ID:6Alav1/S
ひらめいた!

prog -abcde
を引数解析するには
prog -a -b -c -d -e
に変換すればいいんじゃね?

【お題】
prog --foo -abcde --bar param

prog --foo -a -b -c -d -e --bar param
と実行したように見せかけるにはどうしたら良いか?
2018/08/31(金) 05:07:23.65ID:QWemr4wG
>>474
getopt(1)を一度でも使えばそんなお題を出さずにすむのに
2018/08/31(金) 05:17:02.08ID:91l/t0hy
上のちょっと変わった人だろう
2018/08/31(金) 07:41:02.63ID:6Alav1/S
getoptはロングオプション使えないじゃん
478デフォルトの名無しさん
垢版 |
2018/08/31(金) 07:58:25.86ID:ii43Mx6H
バッチはシェルではないけどMSDOSはシェルなん?
2018/08/31(金) 08:33:46.47ID:NkcoCIHS
おまえら車輪の再発明が好きだな(´・∀・`)
2018/08/31(金) 08:44:41.63ID:csqJsH/K
>>478
MS-DOSはWindows以前に使われていたCLIベースのOSの名前
MS-DOSではcommand.comというシェルが使われいていた
バッチファイルはcommand.com用のシェルスクリプト
バッチファイルはバッチ処理を行うために使われていたシェルスクリプト

Windows 9x系でもcommand.comは存在しDOSプロンプトとも呼ばれる。
16bitアプリケーションでありMS-DOS互換環境を提供する役割もあった

Windows NT系ではMS-DOSが完全に廃止され、DOSプロンプトから
名前を変えてコマンドプロンプト(cmd.exe)が標準のCLIシェルとなった。
(32bit版では互換性のためにcommand.comも残っているが
NT系はMS-DOSが存在しないため、実行環境はWindows 95と大きく異なる)

まとめると
MS-DOS、Windows 9x(95, 98など)、Windows NT(XP、7、10など)がOSの名前
command.com、cmd.exeがシェルの名前
拡張子 .bat .cmd のファイルが、バッチファイル
バッチファイルで行う処理がバッチ(処理)
シェルでバッチ処理を行うためのスクリプトがシェルスクリプト
481デフォルトの名無しさん
垢版 |
2018/08/31(金) 12:15:59.98ID:4WvfdMT+
めっちゃ早口で言ってそう
482デフォルトの名無しさん
垢版 |
2018/08/31(金) 12:54:57.94ID:hD6bHOXY
録音してゆっくり再生してようやっと何言ってるかわかる、ぐらいかな
2018/08/31(金) 13:05:55.30ID:DXKxWv2O
>>481-482
本当に自覚してないようだから教えてあげるけど
そういうくだらない雑談をよそでやんなさいって言ってんの。

それともそのレスになにか価値があるというのなら
どうぞいってください。話を聞くよ?
2018/08/31(金) 13:17:47.02ID:ANKbwE4L
子供だなあ
485デフォルトの名無しさん
垢版 |
2018/08/31(金) 13:42:20.88ID:hD6bHOXY
このスレは君が価値を感じる書き込みをしなければならないスレではない。
486デフォルトの名無しさん
垢版 |
2018/08/31(金) 13:43:18.09ID:hD6bHOXY
キリッ
2018/08/31(金) 13:44:06.35ID:sUUndK8T
ここって5chだよな?
2018/08/31(金) 13:44:30.70ID:H6r51FSy
うん
2018/08/31(金) 14:03:56.61ID:DXKxWv2O
せっかくプログラム板に移動したのに、荒らしは消えないのねw
2018/08/31(金) 14:48:59.64ID:LaBPL+3F
どういうぎゃぐなのかと思わせられるほどの無自覚ぶり。他人に自覚とか言ってるのに
2018/08/31(金) 15:00:22.51ID:/mKi/Wls
             )ソ)
          ッλ ノ(.,ノ)
         (゙- ..::.::. . (
        (ソ.  .彡⌒ミ. )ソ)
        ).::'; (´・ω・`) ス (
       ソ .::;';'(つ ⊂)::;';'`〜、.
       (  :;';' |__∧_| ::;';'  ヽ)
`'~`'''`'`'`~'~~`~~'`'`''''"`'`'`''`''''"`'``'~`''`'~`'''`'`'`~
 さ あ 禿 げ 上 が っ て ま い り ま し た
2018/08/31(金) 15:07:49.61ID:H6r51FSy
頭に刺さってる髪の数だけ書き込みを許してやる
2018/08/31(金) 15:20:54.53ID:vplIlyda
ファイルの更新について教えてください

フラッシュメモリ(SDカード)にファイルを保存しています
ご存知のようにフラッシュメモリには書き換え回数があり
使いすぎると壊れるのですが

シェルでリダイレクトして追記していく形にした場合
追記分のブロック数分が更新されると考えていいのでしょうか
もしくは100バイト追記してもファイルの大きさが100MBあったら
ファイルシステム上再配置されて
フラッシュメモリ上は100MB相当(のブロック)の更新がかかりますか?

またviなどのエディタで更新した場合はどうなのでしょうか?
やはり100MB分の更新になりますか?
494デフォルトの名無しさん
垢版 |
2018/08/31(金) 16:11:16.42ID:j8UTgVSe
>>493
OSやドライバに依存する。

でもだいたいはライトキャッシュがあって実際の書き込みは中々されないと思うよ。
ましてや書き込み回数が多くなると劣化するメデイアと初めからわかっているものに対してバンバン書くようなことは普通のドライバならしないと思う。
2018/08/31(金) 19:32:51.61ID:OUCwI4mz
この動きって仕様ですか?
No1と同じような動きを$@を一旦別の変数に入れて
実行したいのですがなにか方法はありますか?

./test.sh "a 1" "b 2"

# No1
for i in "$@"; do
 echo $i
done
# a 1
# b 2

# No2
args="$@"
for i in "$args"; do
 echo $i
done
# a 1 b 2

# No3
args="$@"
for i in $args; do
 echo $i
done
# a
# 1
# b
# 2
2018/08/31(金) 19:46:53.74ID:QWemr4wG
>>495
仕様だと思う。
$@の時点ではシェルが解釈した引数ごとに分かれているのに対して
"$@"←のようにしてしまうとそれがひとまとまりに見做されてしまい
結局args="a 1 b 2"と代入していることになる。
2018/08/31(金) 19:51:37.92ID:QWemr4wG
解決方法はevalやらを使って
#! /bin/sh

n=1
for i in "$@"; do
eval "arg$n=\"$i\""
n=$((n + 1))
done
こうやるといいんでは。
arg3とかで「3番目の引数」を参照できるようになってる筈
2018/08/31(金) 19:53:52.69ID:QWemr4wG
ていうか質問の内容から察するに二種類の別の引数を処理したいんだよね?
すなおにPythonとか使ったほうがいいとは思うが……
俺が示したやり方だと引数の位置が絶対参照だし 引数を処理する度に変数が衝突するし

もちろん俺の方法が下手というのもあるが まあシェルスクリプトで引数処理は鬼門であることは間違いない
2018/08/31(金) 19:59:38.59ID:OUCwI4mz
どう解釈すれば、この挙動を理解できますかね?

./test.sh "a 1" "b 2"

for i in "A $@ Z"; do
echo $i
done
# A a 1
# b 2 Z

for i in "A Z"; do
echo $i
done
# A Z
2018/08/31(金) 20:04:13.23ID:4o8e5lPA
>>493
シェルの追記はかからない。
vi/vim はかかる。

>> 495
仕様。配列にぶっこむ。
HOGE=("$@")
for ent in "${HOGE[@]}"; do
echo $ent
done
2018/08/31(金) 20:20:45.59ID:4o8e5lPA
>>499
"A $@ Z" → A\_a\_1_b\_2\_Z
"A Z" → A\_Z
アンダースコアはスペースと思ってくれ。
ダブルクォートはスペースをエスケープしてる。
man に載ってたと思って読んでたが見つからんかった。
2018/08/31(金) 20:47:48.56ID:6cxiNGZa
man の特殊パラメータの項に書いてあるのはこういうことか?
"A $@ Z" → "A ""$@"" Z"
確かに動作は同じだ。
試したコードはこんな感じ

for i in "$@"; do
echo $i
done
for i in "A $@ Z"; do
echo $i
done
for i in "A ""$@"" Z"; do
echo $i
done
2018/08/31(金) 20:52:30.52ID:OUCwI4mz
よくわからんね。 $@がダブルクォートの中に入ってたら
"$1" "$2" ・・・ "$n" に展開されるってことかな?

でもそれだと
# A a 1
こうなる理由がよくわからなんのだよな

"A $@ Z" は
"A $1" "$2" "$3" ・・・ "$n Z" に
展開されているとしか思えない
2018/08/31(金) 21:53:31.46ID:KmkRvZ7D
>>495
IFS="\n" を設定すると No3 は
a 1
b 2

>>499
IFS="\n" を設定して
args="$@"
for i in A $args Z; do
echo $i
done
ならば
A
a 1
b 2
Z

となりました
2018/08/31(金) 23:13:07.36ID:QWemr4wG
>>504
>>497じゃだめなん?
2018/08/31(金) 23:15:52.07ID:QWemr4wG
>>503
あ すまんこっちか。
>>497じゃだめなの?
2018/08/31(金) 23:29:17.32ID:OUCwI4mz
イイかダメかで言えば、arg1、arg2、arg3、・・・では
ループできないのでこれだけではだめですね。
シェルスクリプトにもライブラリが欲しい所ですね
508デフォルトの名無しさん
垢版 |
2018/08/31(金) 23:44:36.90ID:4ZfpOo1s
そんなもんいらない
そんなん使うぐらいなら別のスクリプトを
シェルから使う

ホントな頭悪いことばっかりいってるわ
2018/09/01(土) 00:01:57.02ID:Z9gelboG
>>507
もう何度も言ってるが別の言語を使え
お前は家で生ハムを作ろうとしているようだぞ
素直に店で買ったほうが旨いし危険性も少ないぞ
2018/09/01(土) 04:09:47.42ID:IN1XIdeB
最初は使い捨てだからとシェルスクリプトを書くが
なんだかんだ使い続けて、利便性向上の為にアップデートを続け
最後には複数ファイルに及ぶ意外に大規模な代物に
今更マトモな言語で作り直すのも面倒臭い
やるなら最初からマトモな言語で作っておけば良かったと
511デフォルトの名無しさん
垢版 |
2018/09/01(土) 05:19:02.92ID:Z9gelboG
>>510
その通り
一部のよほど頭の良い人(USP研究所とかそのあたり)じゃないと
まともに扱えない単純だけど難しい言語

ほとんどの人間はPythonやらを使ったほうがいい
Pythonはエラー処理やセキュリティ関連も既定で充実してるから
バカでもプログラムが書けるようになってる
512デフォルトの名無しさん
垢版 |
2018/09/01(土) 06:18:36.99ID:j0QmLW2E
シェルスクリプトを他のスクリプトへコンバートするツールとか無いのかな?
2018/09/01(土) 07:21:55.56ID:mPcVbgud
>>510
シェルスクリプト使うのは、
シェルスクリプトでやるのが適している場合で
規模で決めるもんじゃないだろ?
2018/09/01(土) 07:58:52.51ID:dtHP3qHu
>>513
規模で決めても変わらんだろ
シェルスクリプトに向いてなければどーせ規模が増える
2018/09/01(土) 08:09:40.25ID:mPcVbgud
例えば、rbenvとか、それなりの規模だけど
シェルスクリプトで作るのが適している
2018/09/01(土) 08:10:56.58ID:kUpkBQ3x
>>493-494
>追記分のブロック数分が更新されると考えていいのでしょうか
たぶん、追記分だけ

ページサイズが4KB で、20KB のファイルがある時、
追記すると、最初の5ページに変化はない。
6ページ目が追加されるだけ

ただし、ファイルの中ほどを更新した場合は、どうなるかわからない。
3ページ目だけを更新した場合、1, 2, 4, 5ページに変化はないけど、

3ページ目のサイズが大きい場合、6ページ目を確保して、それを間に入れるから、
1, 2, (3, 6,) 4, 5 のようなページの並びになるのかな?

まあ、ファイルシステムの説明を読まないと、わからない
2018/09/01(土) 08:19:23.69ID:kUpkBQ3x
vagrant, chef は、Ruby で書かれているだろ

大きい手順書を、シェルスクリプトで書くのは、途方もない!
2018/09/01(土) 08:31:44.88ID:Z9gelboG
・テスト環境……なし
・ドキュメント生成……なし
・バージョン管理……なし
・パッケージシステム……なし
まあそりゃ大規模開発には向かないわな。
やってもいいのは上記の諸々を自作できるような賢い人間。
(俺を含めた)普通の人間は「連番画像をDLする」とか「写真フォルダを整理する」
ときに一度限りのシェルスクリプトを書く程度に留めて
開発はPythonやRubyやJava(個人的に後者二つはあまり好きじゃないが)を利用するのが一番いい。
もちろん自身にとってもだが,他人にとっても不具合が少ないし事故が起こりにくいというのは大きな利点でしょうね。
2018/09/01(土) 08:38:18.84ID:mPcVbgud
>>517
シェルに関係ないツールなのだから当たり前では?

手順書がいつシェルに適していると?
rbenvは手順書じゃないよ
2018/09/01(土) 08:45:05.20ID:mPcVbgud
>>518
それ理屈にあってないだろ

"作れない" ならともかく、現在ないから大規模開発に向かないという理屈なら、
あれば大規模開発に向いているって言うことになるぞw

例えば、今はsystemdに役目を移してしまったが、
Linuxの起動の仕組みはシェルスクリプトだった。

ちなみにgitも結構シェルスクリプトが含まれているよ
https://github.com/git/git/blob/master/contrib/subtree/git-subtree.sh

それにテストもドキュメントもバージョン管理もあるね。
(って今気づいたがバージョン管理ってなんだ?)
2018/09/01(土) 08:48:34.52ID:mPcVbgud
なんか、JavaScriptと同じ空気を感じるな。
いろんな仕組みがないから、簡易的な用途にしか使えないと
最初は思われていたが、それらの仕組みが揃った今では
サイト全体をJavaScriptで作るのもありえないことではなくなった。
2018/09/01(土) 08:50:14.95ID:dtHP3qHu
>>515
前提条件なしのインストーラーみたいな選択肢が他に挙がらないパターンは違うだろ

適してるかどうかで考えるってのは誰も否定せんわ
篩や目安として考えるのが規模だって話だろ
2018/09/01(土) 08:53:58.50ID:mPcVbgud
>>522
だから規模で判断するのは間違いという結論になると言ってるんだが?
2018/09/01(土) 08:56:54.80ID:J8s4Euww
>>513
具体的にはどういう場合?
2018/09/01(土) 09:00:31.35ID:mPcVbgud
>>524
だからrbenvっていってるじゃん。
2018/09/01(土) 09:01:03.88ID:J8s4Euww
>>525
具体的に
2018/09/01(土) 09:03:56.67ID:dtHP3qHu
>>523>>525
それは例外であって反例ではない
2018/09/01(土) 09:07:50.87ID:kUpkBQ3x
仮想化は、典型的な手順書だろ。
パッケージをダウンロードして、インストールして、環境変数PATH を通して

シェルスクリプトで作るのは面倒。
Ruby でOK
2018/09/01(土) 09:16:02.22ID:Z9gelboG
まあRubyじゃなくてもRubyのように
ドキュメント生成やパッケージ管理ができればいいんだよね
PythonがいいよPythonが。
2018/09/01(土) 09:23:11.21ID:mPcVbgud
>>527
え?今求められてる「例」は
「シェルスクリプトが適している物」でしょ?

いつの間に質問が「シェルスクリプトが適さない物」にすり替わって、
rbenvを「例外」としてだしたと思ったの?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況