シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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/
探検
シェルスクリプト総合 その27
■ このスレッドは過去ログ倉庫に格納されています
2018/05/03(木) 17:54:23.25
2018/06/27(水) 07:24:03.91
2018/06/28(木) 16:24:57.87
dashで動くシェルスクリプトってPOSIX準拠のシェルスクリプトだと思って問題ない?
2018/06/28(木) 17:11:46.11
そいつから呼ぶコマンドもPOSIXじゃないとな。
2018/06/29(金) 00:29:23.70
dashはPOSIX準拠である
だからPOSIX準拠のコードはdashで期待どおり動く
だけどdash専用のコードはPOSIX準拠ではない
だからPOSIX準拠のコードはdashで期待どおり動く
だけどdash専用のコードはPOSIX準拠ではない
2018/06/29(金) 01:00:02.18
kshのposixモードがかな。POSIX仕様の元となった自負があるだろうからposixモードもちゃんとしてそう
2018/06/30(土) 22:10:41.02
あの,すごく初歩的なことだと思うのですが,
Excelなどのように隣のセルの値を参照して現在のセルの値を計算するという手法を
シェルスクリプトで行うにはどうすればいいでしょうか。
具体的には,参照した値をaとして,(1-sin^2(a))/2^aを計算したいです。
Excelだと,A列に値を入力していき,B1セルに「(1-(SIN(A1))^2)/2^A1」と入力した後ドラッグすればいいのですが……。
Excelなどのように隣のセルの値を参照して現在のセルの値を計算するという手法を
シェルスクリプトで行うにはどうすればいいでしょうか。
具体的には,参照した値をaとして,(1-sin^2(a))/2^aを計算したいです。
Excelだと,A列に値を入力していき,B1セルに「(1-(SIN(A1))^2)/2^A1」と入力した後ドラッグすればいいのですが……。
2018/06/30(土) 22:52:18.06
a=値
echo "(1-s($a)^2)/2^$a" | bc -l
とか?
echo "(1-s($a)^2)/2^$a" | bc -l
とか?
2018/07/01(日) 20:12:26.02
cat <<. | xargs -I @ echo (1-s(@)^2)/2^@ | bc -l
3
44
-6
.
こんなのでどう?
3
44
-6
.
こんなのでどう?
2018/07/02(月) 14:00:06.28
cat と echo と print の違いが分からない
あと、print と printfの違いも
教えて
あと、print と printfの違いも
教えて
2018/07/02(月) 14:00:38.56
less と moreも
2018/07/02(月) 14:07:32.55
manすりゃいいんじゃないの
2018/07/02(月) 14:15:59.23
cat と echo,printf は全然違う。主に出力するソースが(ゆえにパイプで入力受ける受けないとなり?)
echo と printf は、書式が指定できるかというか、コマンド由来とC由来かな
printって?awk内のならprintはechoのようなもんかな(Ubuntuには print がコマンドであるけど Mailcap とかナニそれな普通じゃないのだな)
echo と printf は、書式が指定できるかというか、コマンド由来とC由来かな
printって?awk内のならprintはechoのようなもんかな(Ubuntuには print がコマンドであるけど Mailcap とかナニそれな普通じゃないのだな)
2018/07/02(月) 14:19:26.23
ググったらechoは改行されてしまうけどprintfは自分で\nしないと改行されないってあった
2018/07/02(月) 14:23:46.00
それらの違いが分からないのは使ってないからだろ
使ってないなら知る必要もないし知ろうとも思わない
自作自演かな?
使ってないなら知る必要もないし知ろうとも思わない
自作自演かな?
2018/07/02(月) 14:26:27.85
>>791
宿題
宿題
2018/07/02(月) 14:27:23.78
コマンド由来とC由来ゆうてるやんw
printf(1) は printf(3) と同じと思えば不思議ではないだろう。echo も -n で改行しないようにもできるけどイレギュラー、コマンド由来だからな
>>791
まあ、なんの目的で聞いてるのかさっぱりわからんくはあるな。なんの自作自演なのかさっぱりだけど
printf(1) は printf(3) と同じと思えば不思議ではないだろう。echo も -n で改行しないようにもできるけどイレギュラー、コマンド由来だからな
>>791
まあ、なんの目的で聞いてるのかさっぱりわからんくはあるな。なんの自作自演なのかさっぱりだけど
2018/07/02(月) 14:27:58.46
>>792
宿題かああ。程度が低いな。高校でとかか?
宿題かああ。程度が低いな。高校でとかか?
2018/07/02(月) 14:28:13.36
>>792
あぁ…
あぁ…
2018/07/02(月) 14:39:06.49
>コマンド由来
コマンドはつねに改行されるの?
コマンドはつねに改行されるの?
2018/07/02(月) 14:40:31.96
あと、printfのfって何?
f付けたのはcが最初?
fって?
f付けたのはcが最初?
fって?
2018/07/02(月) 14:44:50.94
少しは自分で調べろよ
2018/07/02(月) 14:47:13.07
調べたから改行の事分かったんだけど?
2018/07/02(月) 14:47:50.56
もっと自分で調べろよ
2018/07/02(月) 14:49:35.35
じゃぁfだけヒント教えて
2018/07/02(月) 14:50:22.47
それな
2018/07/02(月) 14:50:43.52
2018/07/02(月) 14:55:17.35
>>803
どうもありがとうございました
どうもありがとうございました
2018/07/02(月) 15:22:33.69
礼儀正しいな
少し見直したw
少し見直したw
2018/07/02(月) 15:24:56.72
manとinfoどっち使ってる?
infoは文中から別のページに飛べるから便利そうだけどウェブブラウザのように戻る進むボタンがあるわけでも無いし全部文字だけだから現在位置が分からなくなるからmanがいいと思うんだけどどう?
infoは文中から別のページに飛べるから便利そうだけどウェブブラウザのように戻る進むボタンがあるわけでも無いし全部文字だけだから現在位置が分からなくなるからmanがいいと思うんだけどどう?
2018/07/02(月) 15:25:43.12
なんか最近ほんとこういうアンケートみたいなの増えたな
どっかから流れてきたか?
どっかから流れてきたか?
2018/07/02(月) 15:27:19.76
この質問は乾燥機かせてほしいだけだから
2018/07/02(月) 15:29:11.19
UNIX板だからmanだな
2018/07/02(月) 15:31:13.31
何を乾燥させたいのかしばらく悩んだ
2018/07/02(月) 18:41:01.45
「乾燥機貸して」ってアンジャッシュのネタにあったなそういや
812名無しさん@お腹いっぱい。
2018/07/02(月) 19:09:02.32 man manて口で言うと恥ずかしいからinfo
2018/07/02(月) 19:35:17.38
rcsのco(1)を
2018/07/02(月) 21:56:08.50
tinfo
2018/07/02(月) 22:32:14.11
そのあたりのネタはもう聞き飽きた
2018/07/03(火) 00:21:24.80
ディレクトリの中の拡張子がm2tsのファイル全てをtsselectというコマンドに投げてその標準出力をひとつのファイルに追記で書き込みたいんですが、その際、ファイル名も一緒に書き込みたいです。
どうやってファイル名を取得するんでしょうか?
$ tsselect *.m2ts > ana.log
どうやってファイル名を取得するんでしょうか?
$ tsselect *.m2ts > ana.log
2018/07/03(火) 00:43:49.80
1行で書けなかったので、複数行に分けてfor分を使いました。
2018/07/03(火) 01:01:05.23
こんなん?
for i in *.m2ts; do echo $i >>ana.log; tsselect $i >>ana.log; done
for i in *.m2ts; do echo $i >>ana.log; tsselect $i >>ana.log; done
2018/07/04(水) 07:39:11.34
近頃のどこか(このスレかも)で,
「fgrepはgrepより遅い」というような話を耳にしたんですが,ほんとうですか?
手元のgrepで試したところ,ほとんど有意な差はありませんでしたが……。
「fgrepはgrepより遅い」というような話を耳にしたんですが,ほんとうですか?
手元のgrepで試したところ,ほとんど有意な差はありませんでしたが……。
2018/07/04(水) 08:10:45.64
それぞれ独自バイナリだった昔の話な。
あとgrepよりegrepの方が速かったんで、
今でも手はegrepを優先して打っちゃうけどな。
あとgrepよりegrepの方が速かったんで、
今でも手はegrepを優先して打っちゃうけどな。
2018/07/04(水) 08:43:22.98
いや独自バイナリだった頃もfgrepの方が速かったような。
grepだけ非決定性オートマトンで遅い的な。
grepだけ非決定性オートマトンで遅い的な。
2018/07/04(水) 15:23:44.48
ファイルの一括リネームで
$ find . -name "*X*" | while read F; do mv $F ${F/X/Y}; done
だとXXXがYXXになるんですけどYYYにするには繰り返さなきゃいけないんですかね?
$ find . -name "*X*" | while read F; do mv $F ${F/X/Y}; done
だとXXXがYXXになるんですけどYYYにするには繰り返さなきゃいけないんですかね?
2018/07/04(水) 16:18:50.48
If pattern begins with /, all matches of pattern are replaced with string.
2018/07/04(水) 16:22:26.78
日本語で書いてくれないとわかりません
できれば修正したコマンドを書いてください
できれば修正したコマンドを書いてください
2018/07/04(水) 16:25:40.84
お断りします
2018/07/04(水) 16:27:15.37
断る理由とは?
2018/07/04(水) 16:29:57.71
ひな鳥に餌を上げるのはひな鳥がかわいいからだ
なんかこのひな鳥うざいって思ったら餌は与えない
なんかこのひな鳥うざいって思ったら餌は与えない
2018/07/04(水) 16:31:49.67
可愛く思われる質問の仕方でもあったんですかね
2018/07/04(水) 16:34:15.63
とりあえず「sh 変数展開」あたりでggってからここに来い
それで分からなきゃどこかの暇人が餌与えてくれるまでずっと待ってな
それで分からなきゃどこかの暇人が餌与えてくれるまでずっと待ってな
2018/07/04(水) 16:35:48.08
ありがとうございました
2018/07/04(水) 16:54:10.40
もう来んなよ
2018/07/04(水) 18:24:31.29
すみません
ワードとかに出来る~$で始まるファイルを一括で消したいのですがどうすればいいですか。
find ./ -name "~$*" -exec rm -rf {} \;
これだと上手くいかないです。
find ./ -name "~\$*" -exec rm -rf {} \;
エスケープしてもダメです。
find ./ -name "~*" -exec rm -rf {} \;
これだと上手くいきますが$も指定するためにはどうすればいいですか。
ワードとかに出来る~$で始まるファイルを一括で消したいのですがどうすればいいですか。
find ./ -name "~$*" -exec rm -rf {} \;
これだと上手くいかないです。
find ./ -name "~\$*" -exec rm -rf {} \;
エスケープしてもダメです。
find ./ -name "~*" -exec rm -rf {} \;
これだと上手くいきますが$も指定するためにはどうすればいいですか。
2018/07/04(水) 18:27:42.16
シングルクォート使っとけばぁ
2018/07/04(水) 18:30:53.83
>>833
上手くいかないです
$ find . -name ~'$'*
Unknown user: $*.
$ find . -name "~'$'*"
Illegal variable name.
$ find . -name ~"$"*
Illegal variable name.
$ find . -name '~"$"*'
何も出力されない
上手くいかないです
$ find . -name ~'$'*
Unknown user: $*.
$ find . -name "~'$'*"
Illegal variable name.
$ find . -name ~"$"*
Illegal variable name.
$ find . -name '~"$"*'
何も出力されない
2018/07/04(水) 18:41:11.43
自己解決
bashにしたら\で普通にエスケープできました
find . -name "~\$*"
なんでcsh使ってたんだろ
bashにしたら\で普通にエスケープできました
find . -name "~\$*"
なんでcsh使ってたんだろ
2018/07/04(水) 18:44:18.71
csh使ってたならプロンプト$にすんなよ紛らわしい
2018/07/04(水) 18:46:56.81
cshだと%でしたねすみません
% find . -name "~\$*"
% find . -name "~\$*"
2018/07/04(水) 20:48:13.14
なんで-rつけてんねん
2018/07/04(水) 20:56:00.21
ファイルフォルダ関係なく消したいからフォルダがないとわかっていても付けてる
2018/07/04(水) 21:12:02.88
\; より + かな。forkの遅いCygwinでは特に。
2018/07/04(水) 21:21:14.22
最後以外の改行を削除する単純で可搬な方法を探しています。
私が現在使っている方法は
cat <<. | tr -d '\n' | printf '%s\n' "$(cat)"
a
bbb
cc
.
です。これは可搬性は抜群ですが、冗長すぎると感じています。
できれば一つのコマンド(sedとか?)で済ませたいです。よろしくお願いします。
私が現在使っている方法は
cat <<. | tr -d '\n' | printf '%s\n' "$(cat)"
a
bbb
cc
.
です。これは可搬性は抜群ですが、冗長すぎると感じています。
できれば一つのコマンド(sedとか?)で済ませたいです。よろしくお願いします。
2018/07/04(水) 21:32:09.95
awkで
2018/07/04(水) 21:34:23.01
フォルダっつーかディレクトリ
2018/07/04(水) 21:37:25.99
同じだろ
2018/07/04(水) 21:40:52.56
2018/07/04(水) 22:22:07.40
2018/07/04(水) 23:00:04.93
2018/07/05(木) 09:36:25.04
Mac付属のsedじゃうまく行かなかった、ってお呼びじゃないか
最近のBSD sedはどうかわからないけど
最近のBSD sedはどうかわからないけど
2018/07/05(木) 10:23:41.12
2018/07/05(木) 12:53:17.75
macOSだけでなくBSDでだめっぽい。BSDでだめというか、GNU sedでなら動くか
2018/07/05(木) 14:18:26.92
主にパターンスペースに対して処理した直後にどうするってとこの違いかな。他ではBSDでもmacOSとOpenBSDでは行を処理しなかった場合どうするがちょっと動作が違ったり、いろいろ鬼門だなsedは
sed '$!{H;d;};${H;g;s/\n//g;}'
で、いちおう、sedもGNU sedものようだけど、ゴテっとはしてんな
sed '$!{H;d;};${H;g;s/\n//g;}'
で、いちおう、sedもGNU sedものようだけど、ゴテっとはしてんな
2018/07/05(木) 14:50:09.34
2018/07/05(木) 15:36:04.46
>>845のMacやBSD向け変種でけた
sed -e :l -e 'N;s/\n//;$p;bl'
sed -e :l -e 'N;s/\n//;$p;bl'
2018/07/05(木) 15:51:48.45
おおっ
ラベルを別にすれば/しなきゃなのか
$はそこに入れるのか、なるほど
GNU sedではそれだと...オプションで変えられるかな
くせが強いw
ラベルを別にすれば/しなきゃなのか
$はそこに入れるのか、なるほど
GNU sedではそれだと...オプションで変えられるかな
くせが強いw
2018/07/05(木) 17:34:11.18
教訓。移植性を重視するならsedで変なことするな。普通の正規表現だけ使え
2018/07/05(木) 18:25:50.29
昔はもっと酷かったんだろうな #移植性
sedだけじゃなくてgrepとかも。
sedだけじゃなくてgrepとかも。
2018/07/05(木) 18:33:28.39
2018/07/05(木) 18:41:45.18
ぐぬぅ
2018/07/05(木) 22:10:39.00
sed で可搬性を考えると、セミコロンで分ける方法はちょっとあやしいから、
愚直に -e で分けるしか無いのかも知れない、短く書けないけどw
それはさておき、sed の「無限ループに N を入れる」って、趣があると思うんだよね。
C で「ファイルを while の条件文で fgets() が EOF になるまで読み込む処理」に近いというか。
愚直に -e で分けるしか無いのかも知れない、短く書けないけどw
それはさておき、sed の「無限ループに N を入れる」って、趣があると思うんだよね。
C で「ファイルを while の条件文で fgets() が EOF になるまで読み込む処理」に近いというか。
2018/07/05(木) 22:32:39.96
2018/07/05(木) 23:00:24.55
>>859
溜めに溜めて溜め込んでってイメージしかないなw
そのwhile〜fgets〜で言うなら、中にreallocでどんどこ的な
実際どうなんだろと65Mのファイルで「ちょっと」試したら、使用メモリは増えない(??)けど終わらんぞw
溜めに溜めて溜め込んでってイメージしかないなw
そのwhile〜fgets〜で言うなら、中にreallocでどんどこ的な
実際どうなんだろと65Mのファイルで「ちょっと」試したら、使用メモリは増えない(??)けど終わらんぞw
2018/07/06(金) 00:57:10.67
bashのプロセス置換なんですけど、最初のプロセス置換が/dev/fd/63に固定(?)されているのはなにか理由があるんですかね。
bash-4.4$ eval echo $(yes '<(echo) ' | head -n 63)
とやったら/dev/fd/63からデクリメントされていって/dev/fd/5→/dev/fd/3→/dev/fd/64
という謎の変化を経てインクリメントされていくという……。
これ仕様ですかね。
bash-4.4$ eval echo $(yes '<(echo) ' | head -n 63)
とやったら/dev/fd/63からデクリメントされていって/dev/fd/5→/dev/fd/3→/dev/fd/64
という謎の変化を経てインクリメントされていくという……。
これ仕様ですかね。
2018/07/07(土) 16:45:13.41
仕様です
63は昔は大きい数字だったのですが
最近は小さくなってしまった
63は昔は大きい数字だったのですが
最近は小さくなってしまった
2018/07/07(土) 19:05:22.41
数千行のCSVの値を一個一個指定の条件に沿っているかチェックするにはシェルスクリプトでも出来ますかね?
参考書教えて頂けたら嬉しいです。
それともこういうのは他のスクリプトの方が適してたりしますか?
perlも使える環境ではあります。
参考書教えて頂けたら嬉しいです。
それともこういうのは他のスクリプトの方が適してたりしますか?
perlも使える環境ではあります。
2018/07/07(土) 19:24:54.18
>>864
そのチェックが他の行の参照を含まなくて、shellでできるかという質問にawkやsedも含まれているのなら、できる
というか、excelでやったりしないし、最近はpythonでやることが多い
そのチェックが他の行の参照を含まなくて、shellでできるかという質問にawkやsedも含まれているのなら、できる
というか、excelでやったりしないし、最近はpythonでやることが多い
2018/07/07(土) 20:21:55.89
指定の条件によるな。CSVの項目も数値や文字列だけだったらシェルスクリプトだけでもできるだろう
2018/07/07(土) 20:52:55.66
ああ、文字列の中のフィールドセパレータ(,)をフィールドセパレータとして除外というのはしないか。awkも同じかな。やってできないこともないだろうけどめんどくさいな
perlはcsv処理するモジュールを入れてだっけ、pythonは最初から入っているよな
perlはcsv処理するモジュールを入れてだっけ、pythonは最初から入っているよな
2018/07/07(土) 21:04:50.61
それ以前にCSVのフォーマットによると思う
改行とかカンマとかダブルクォーテーションを含むとかをきちんとやりだすとシェルだけでもできるだろうけどやりたくない
改行とかカンマとかダブルクォーテーションを含むとかをきちんとやりだすとシェルだけでもできるだろうけどやりたくない
2018/07/07(土) 23:07:51.61
またCSV嵐が来てんのか
2018/07/07(土) 23:12:15.86
カンマ入っている場合には "" もしくは '' で囲わなければならないから、それはシェルスクリプトにとっても都合がいい、
IFS=',' fields=($raw)
で簡単にと思ったがそう甘くはなかった。最近流行りのevalでなんとかだとしても、$とかまた別の問題があるしなあ
IFS=',' fields=($raw)
で簡単にと思ったがそう甘くはなかった。最近流行りのevalでなんとかだとしても、$とかまた別の問題があるしなあ
2018/07/07(土) 23:14:30.65
>>869
別にあれとは違うだろうにw 単にCSVだからって拒否反応示しすぎ
別にあれとは違うだろうにw 単にCSVだからって拒否反応示しすぎ
2018/07/07(土) 23:47:30.31
皆さんお答えありがとうございます。
出来るけど面倒だという感じですね。
PHP使いたいけど仕様上ダメみたいなんですよね。。。
後にメンテナンスが面倒くさそう
出来るけど面倒だという感じですね。
PHP使いたいけど仕様上ダメみたいなんですよね。。。
後にメンテナンスが面倒くさそう
2018/07/07(土) 23:50:19.59
>>867
残念ながらpythonは入ってなかったです。DBサーバーなんで
残念ながらpythonは入ってなかったです。DBサーバーなんで
2018/07/08(日) 00:37:11.05
>>873
perlで高機能な(?)Text::CSVを入れればだけど、それすらなら、
http://t2aki.doncha.net/?id=1403586022
なんぞの数行のをコピペってでもかな。後はperlスレだな
perlで高機能な(?)Text::CSVを入れればだけど、それすらなら、
http://t2aki.doncha.net/?id=1403586022
なんぞの数行のをコピペってでもかな。後はperlスレだな
2018/07/09(月) 08:36:49.76
>>869
いいえ、また "お前" が来てるんですよ
いいえ、また "お前" が来てるんですよ
2018/07/09(月) 09:05:14.05
2018/07/09(月) 13:02:45.84
素直にCで書けばw
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 事実上の減反政策を法定化へ 農水省方針 「需要に応じた生産」推進 [蚤の市★]
- 【鰻】ニホンウナギの規制強化案、ワシントン条約会議で正式に否決 [ぐれ★]
- 【独占直撃】「国分太一と縁は切れない」電動ママチャリで疾走する元TOKIOリーダー城島茂、ついに明かした31年間と沈黙の「本音」 [Ailuropoda melanoleuca★]
- フジテレビ F1地上波放送11年ぶり復活へ 26年シーズンから最大5戦 [征夷大将軍★]
- 【高知】小学校の教員採用、合格者の約6割が辞退 高知県教委、追加選考へ [七波羅探題★]
- 「超富裕層」への追加課税の対象拡大、現行の所得30億円の引き下げで調整 -1億円の壁」是正狙い [蚤の市★]
- 日本人「AIで失業?ないない(笑)日本人を舐めるな😡」 AIに対する楽観姿勢、先進国で異例。 [271912485]
- 32歳で係長って優秀?
- 面倒くさくてぶち切れる
- 【悲報】所得税増税、2027年1月からWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
- 告白
- 仕事って退屈だよな
