X



シェルスクリプト総合 その27
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。垢版2018/05/03(木) 17:54:23.25
シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
 bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
 FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
 最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/
 (左上の「Shell & Utilities」 から参照することができます。)
・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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
 質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
前スレ シェルスクリプト総合 その26
https://mevius.5ch.net/test/read.cgi/unix/1489979246/
0741名無しさん@お腹いっぱい。垢版2018/06/21(木) 17:29:46.87
stty cols 80 rows 25
なんかLINESもってとこから、ターミナルのウィンドウサイズなんぞもってぽいけど、それは個々のターミナルアプリ次第&一方通行っぽい(COLUMNSの値を設定している訳ではないのはそゆこと)けど
0742名無しさん@お腹いっぱい。垢版2018/06/22(金) 07:10:56.19
シェルスクリプトってeval使えばメタプログラミングっぽいことできるよね。
例えば引数をfor文で増加さしてeval arg$i=\$$iみたいな。
0744名無しさん@お腹いっぱい。垢版2018/06/22(金) 08:56:09.19
evalは一番最初に現れたプリミティブなメタプログラミング機能だからまあ当然だな。
ちな最初にeval を発明した言語はLisp な。
0747名無しさん@お腹いっぱい。垢版2018/06/23(土) 10:04:22.34
evalは強力すぎて危険だからどの言語でも濫用はevil扱いだと思う。
REPLみたいにevalがぴったりした応用もあるから禁止はできんし、
シェルスクリプトは比較的ミニマムな言語だからevalしか解がないケースも多いけど。
0748名無しさん@お腹いっぱい。垢版2018/06/23(土) 11:22:58.87
「ミニマルな言語」って他には例えばなに?
それLLとはまた違うの?
いや煽ってるんではなくて単純に訊ねたい。
0749名無しさん@お腹いっぱい。垢版2018/06/23(土) 11:42:26.04
コマンド置換の入れ子の限界を試そうと思って
$ i=1; while true; do echo $i; eval $( (yes '$(echo' | head -n $i | tr -d '\n'); (yes ')' | head -n $i | tr -d '\n') ); : $((i++)); done
↑こんなコードを実行してみた。
100あたりから面白いくらいに遅くなっていく
しかし500くらいまで試したけど表示は続き、限界を探る目的は達成できなかった。
0751名無しさん@お腹いっぱい。垢版2018/06/23(土) 14:46:23.27
eval関連なんですがaliasの出力結果をevalする方法を教えてください。
具体的にはroot権限でlsがしたいのですが、その時通常のlsと同じオプションを付けて実行したいのです。
ですので(通常の状態での)alias lsの結果を変数かなにかに格納してそれを実行しようと思ったのですが良い方法が思い付きません。
そのコマンド自体もaliasにしたい(具体的にはls@rootコマンドとしてalias ls@root=の形で定義したい)です。

どうかよろしくお願いします。
0752752垢版2018/06/23(土) 14:52:25.95
すいません。一番上の行は無視してください。
evalでできるかなと考えてたプロセスが漏れてしまっただけです。
多分このアプローチは間違っているので無視してください。
0759名無しさん@お腹いっぱい。垢版2018/06/24(日) 22:14:10.69
>>748
データ型が少ないって意味でTclとかかな。
でもTclには文字列型の他に連想配列があるのよね。
POSIX shellの範囲内だと引数配列を除けばホントに文字列しかないので。
0760名無しさん@お腹いっぱい。垢版2018/06/26(火) 16:44:06.12
こんにちは

ド素人です。
VPSの立ち上げ時にスタートアップシェルスクリプトを使って効率化したいです。

とあるwgetを叩くと、user名とパスワード、パスワードの再入力を求められるのですが、
このuser名、パスワードをシェルスクリプトで入力させるにはどうしたらよいでしょうか。
0761名無しさん@お腹いっぱい。垢版2018/06/26(火) 17:04:46.28
wgetでgithub上にある既存のシェルスクリプトを叩くと
ユーザー名とパスワードを聞かれるのですが、
その入力を自動化したいという意味です。

github上のシェルスクリプトは変更できません・・・
0764名無しさん@お腹いっぱい。垢版2018/06/26(火) 17:29:12.30
>>761
相手側の要求に従ったuser名パスワードの提供方法をwgetでするとよいでしょう
どのVPS?どういう相手側のサービス?その使ったというはGitHubのどれ?
https://gist.github.com/kevinold/216077/4d725773b46a2ac32c0f5a689339d3da004d7f5d
これでいいのか?適当にぐぐったらVPSだしwget使ってるしw

>>762
まあ、なんかセットアップでコマンド叩いたりするのだろう。そういえばwgetで認証できなかったら再入力なんて求められないよな...??あったかな??
0766名無しさん@お腹いっぱい。垢版2018/06/26(火) 18:04:40.17
httpのBASIC認証やftpのならそれで問題はないよね。普通にBASIC認証でそのオプションを教えてっていうことだけかな
0768名無しさん@お腹いっぱい。垢版2018/06/26(火) 19:26:12.11
wgetが書かれたシェルスクリプトを呼び出すシェルスクリプトを書きたいように見えるが…
まあ質問が日本語的に不自由すぎるね
0769名無しさん@お腹いっぱい。垢版2018/06/26(火) 20:51:22.89
wgetがBASIC認証を要求してくるんですが、
パスワードをシェルスクリプトに書きたくないです。
別ファイルに生パスワードを書くのも嫌です。
かといって毎回入力するのは面倒です。

ssh-agent利用して最初に一回いれて覚えさせるだけで
あとはパスワードなしにできたりしないですかね?
0770名無しさん@お腹いっぱい。垢版2018/06/26(火) 21:11:05.80
ssh-agent/ssh-keychainはどうなんだろ、無理じゃねと思うが、keyring(Linux/BSD)/Keychain Access(macOS)を使えばふつーにできるだろうな
0771名無しさん@お腹いっぱい。垢版2018/06/26(火) 21:17:58.64
最初の質問と内容か変わってるし、パスワード書きたくないらしいので、役にたたないだろうけど、俺ならexpectでスクリプト書く
0774名無しさん@お腹いっぱい。垢版2018/06/27(水) 00:54:07.84
jqについて教えてください。

https://ideone.com/SZlhR4

やり方が分からないので、以下のようにとりあえすyenを指定したら並び順が思ったようになりませんでした。
$ cat kudamono.json | jq -r '.genre_name, .list[].name, .list[].hinshu_list[].yen'

くだもの
りんご
みかん
いちご
180
500
200
50
63
300
null
null
null

続く
0775名無しさん@お腹いっぱい。垢版2018/06/27(水) 00:54:30.18
以下のように標準出力に出す方法を教えてください。

くだもの
りんご
ふじ
180
サンふじ
500
つがる
200
みかん
きんかん
50
いよかん
63
せとみ
300
いちご
あまおう
null
ひのしずく
null
とちおとめ
null
0781名無しさん@お腹いっぱい。垢版2018/06/29(金) 00:29:23.70
dashはPOSIX準拠である
だからPOSIX準拠のコードはdashで期待どおり動く
だけどdash専用のコードはPOSIX準拠ではない
0783名無しさん@お腹いっぱい。垢版2018/06/30(土) 22:10:41.02
あの,すごく初歩的なことだと思うのですが,
Excelなどのように隣のセルの値を参照して現在のセルの値を計算するという手法を
シェルスクリプトで行うにはどうすればいいでしょうか。
具体的には,参照した値をaとして,(1-sin^2(a))/2^aを計算したいです。
Excelだと,A列に値を入力していき,B1セルに「(1-(SIN(A1))^2)/2^A1」と入力した後ドラッグすればいいのですが……。
0789名無しさん@お腹いっぱい。垢版2018/07/02(月) 14:15:59.23
cat と echo,printf は全然違う。主に出力するソースが(ゆえにパイプで入力受ける受けないとなり?)
echo と printf は、書式が指定できるかというか、コマンド由来とC由来かな
printって?awk内のならprintはechoのようなもんかな(Ubuntuには print がコマンドであるけど Mailcap とかナニそれな普通じゃないのだな)
0791名無しさん@お腹いっぱい。垢版2018/07/02(月) 14:23:46.00
それらの違いが分からないのは使ってないからだろ
使ってないなら知る必要もないし知ろうとも思わない
自作自演かな?
0793名無しさん@お腹いっぱい。垢版2018/07/02(月) 14:27:23.78
コマンド由来とC由来ゆうてるやんw
printf(1) は printf(3) と同じと思えば不思議ではないだろう。echo も -n で改行しないようにもできるけどイレギュラー、コマンド由来だからな

>>791
まあ、なんの目的で聞いてるのかさっぱりわからんくはあるな。なんの自作自演なのかさっぱりだけど
0803名無しさん@お腹いっぱい。垢版2018/07/02(月) 14:50:43.52
>>796,797
コマンドで何か出力するのに「改行しない」方が少ないだろうという。echo "Hello"が改行しなかったらプロンプトが続いてとか。改行した方がその機会が多いので省けるだろう
f = フォーマット。printfはCが起源じゃないのかなあ。の前の何かの言語ではprintがあっただろうな(どういうのか知らんけど)

聞く姿勢が小学生低学年並みだな。そろそろ>>798の言うとおり
0806名無しさん@お腹いっぱい。垢版2018/07/02(月) 15:24:56.72
manとinfoどっち使ってる?
infoは文中から別のページに飛べるから便利そうだけどウェブブラウザのように戻る進むボタンがあるわけでも無いし全部文字だけだから現在位置が分からなくなるからmanがいいと思うんだけどどう?
0812名無しさん@お腹いっぱい。垢版2018/07/02(月) 19:09:02.32
man manて口で言うと恥ずかしいからinfo
0816名無しさん@お腹いっぱい。垢版2018/07/03(火) 00:21:24.80
ディレクトリの中の拡張子がm2tsのファイル全てをtsselectというコマンドに投げてその標準出力をひとつのファイルに追記で書き込みたいんですが、その際、ファイル名も一緒に書き込みたいです。
どうやってファイル名を取得するんでしょうか?

$ tsselect *.m2ts > ana.log
0819名無しさん@お腹いっぱい。垢版2018/07/04(水) 07:39:11.34
近頃のどこか(このスレかも)で,
「fgrepはgrepより遅い」というような話を耳にしたんですが,ほんとうですか?
手元のgrepで試したところ,ほとんど有意な差はありませんでしたが……。
0820名無しさん@お腹いっぱい。垢版2018/07/04(水) 08:10:45.64
それぞれ独自バイナリだった昔の話な。
あとgrepよりegrepの方が速かったんで、
今でも手はegrepを優先して打っちゃうけどな。
0822名無しさん@お腹いっぱい。垢版2018/07/04(水) 15:23:44.48
ファイルの一括リネームで
$ find . -name "*X*" | while read F; do mv $F ${F/X/Y}; done
だとXXXがYXXになるんですけどYYYにするには繰り返さなきゃいけないんですかね?
0829名無しさん@お腹いっぱい。垢版2018/07/04(水) 16:34:15.63
とりあえず「sh 変数展開」あたりでggってからここに来い
それで分からなきゃどこかの暇人が餌与えてくれるまでずっと待ってな
0832名無しさん@お腹いっぱい。垢版2018/07/04(水) 18:24:31.29
すみません
ワードとかに出来る~$で始まるファイルを一括で消したいのですがどうすればいいですか。
find ./ -name "~$*" -exec rm -rf {} \;
これだと上手くいかないです。
find ./ -name "~\$*" -exec rm -rf {} \;
エスケープしてもダメです。
find ./ -name "~*" -exec rm -rf {} \;
これだと上手くいきますが$も指定するためにはどうすればいいですか。
0834名無しさん@お腹いっぱい。垢版2018/07/04(水) 18:30:53.83
>>833
上手くいかないです
$ find . -name ~'$'*
Unknown user: $*.

$ find . -name "~'$'*"
Illegal variable name.

$ find . -name ~"$"*
Illegal variable name.

$ find . -name '~"$"*'
何も出力されない
■ このスレッドは過去ログ倉庫に格納されています

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