シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その25
http://echo.2ch.net/test/read.cgi/unix/1439563321/
探検
シェルスクリプト総合 その26 [無断転載禁止]©2ch.net
レス数が900を超えています。1000を超えると表示できなくなるよ。
2017/03/20(月) 12:07:26.41
2018/03/31(土) 22:32:30.06
みんな、変わった(?)の使ってるな。
Linux、BSD、Solarisなどのメジャーなもの以外で何がよく使われてるの?
Linux、BSD、Solarisなどのメジャーなもの以外で何がよく使われてるの?
2018/03/31(土) 22:52:09.24
Mac
2018/04/01(日) 01:13:29.58
MacはBSD系ってことでまとめましょうw
2018/04/02(月) 07:41:52.65
$ man basename > man_basenam
でできるファイルを
emacsとテキストエディットで開いたものが次のものです。
https://imgur.com/a/8ggUs?
これはそういう仕様なのでしょうか?文字化けというか不思議な
コードになっています。できれば教えていただけないでしょうか
でできるファイルを
emacsとテキストエディットで開いたものが次のものです。
https://imgur.com/a/8ggUs?
これはそういう仕様なのでしょうか?文字化けというか不思議な
コードになっています。できれば教えていただけないでしょうか
2018/04/02(月) 08:19:02.96
http://surf.ml.seikei.ac.jp/~nakano/JMwww/html/man/man1/man.1.html
バックスペースとアンダースコアがない プレーンテキスト版の man ページを得るには、コマンド
# man foo | col -b > foo.mantxt
を実行すること。
バックスペースとアンダースコアがない プレーンテキスト版の man ページを得るには、コマンド
# man foo | col -b > foo.mantxt
を実行すること。
2018/04/02(月) 08:25:59.92
2018/04/02(月) 10:28:43.52
man manすればいい
TIPSに載ってる
TIPSに載ってる
2018/04/02(月) 14:17:49.92
あと、emacs に限って言うと
M-x man
(ESC x man リターン)
と叩いて、man のエントリー名を入れれば、
きっちり整形した結果を表示してくれるから、
col -b を使う必要はあまりない。
M-x man
(ESC x man リターン)
と叩いて、man のエントリー名を入れれば、
きっちり整形した結果を表示してくれるから、
col -b を使う必要はあまりない。
2018/04/02(月) 18:03:58.27
2018/04/02(月) 18:24:12.37
yesはなんか処理間違えると止まらなくなりそうで怖いんだよな
2018/04/02(月) 21:00:30.14
>>832
POSIX catには-nオプションがない[*1]のでnlコマンドを使う方法を提案する。
$ yes '' | nl -b a -n ln | head -n 10 | sed -e 's/[ \t]*//g' | tr '\n' ' '
*1: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html
POSIX catには-nオプションがない[*1]のでnlコマンドを使う方法を提案する。
$ yes '' | nl -b a -n ln | head -n 10 | sed -e 's/[ \t]*//g' | tr '\n' ' '
*1: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/cat.html
2018/04/02(月) 21:07:04.97
$ yes '' | nl -b a | head -n 10 | tr -d ' \t' | tr '\n' ' '
修正。もっと簡単にできるわww
修正。もっと簡単にできるわww
836834
2018/04/02(月) 21:28:17.87 これもしかしたらheadコマンドとnlコマンドの順番入れ替えると速度違う?
んなことないと思ってたけどビミョーに差があるかもしれん。
詳しい人検証してくれ……。
$ time for a in $(seq 10000); do seq 10000 > /dev/null; done
real 0m14.601s
user 0m0.452s
sys 0m3.736s
$ time for a in $(seq 10000); do yes '' | nl -b a | head -n 10000 | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 1m2.693s
user 0m5.672s
sys 0m21.032s
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 0m47.944s
user 0m1.472s
sys 0m17.820s
んなことないと思ってたけどビミョーに差があるかもしれん。
詳しい人検証してくれ……。
$ time for a in $(seq 10000); do seq 10000 > /dev/null; done
real 0m14.601s
user 0m0.452s
sys 0m3.736s
$ time for a in $(seq 10000); do yes '' | nl -b a | head -n 10000 | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 1m2.693s
user 0m5.672s
sys 0m21.032s
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -d ' \t' | tr '\n' ' ' > /dev/null; done
real 0m47.944s
user 0m1.472s
sys 0m17.820s
2018/04/02(月) 21:41:13.89
並行して動くか、出力の完了を待ってから動くかの違いだろ
2018/04/02(月) 23:47:22.15
パイプで繋いでプロセス4つも5つも上げるくらいなら、
素直にawk 1プロセスですませた方が軽くないか?
素直にawk 1プロセスですませた方が軽くないか?
839836
2018/04/02(月) 23:56:24.81840836
2018/04/03(火) 00:14:31.67 ていうかseqの既定の出力を勘違いしてた
$ yes '' | head -n 10 | nl -b a | tr -c -d '\n[:digit:]'
こんなもんかな?
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -c -d '\n[:digit:]' > /dev/null ; done
real 0m42.358s
user 0m0.544s
sys 0m14.452s
$ yes '' | head -n 10 | nl -b a | tr -c -d '\n[:digit:]'
こんなもんかな?
$ time for a in $(seq 10000); do yes '' | head -n 10000 | nl -b a | tr -c -d '\n[:digit:]' > /dev/null ; done
real 0m42.358s
user 0m0.544s
sys 0m14.452s
2018/04/03(火) 00:40:30.08
awk 'BEGIN {for(i=10;i<=20;i++) printf "%d\n",i}'
2018/04/03(火) 01:08:09.19
yes '' | sed -n '=;10q'
2018/04/03(火) 14:22:10.27
sedでやるとは
2018/04/03(火) 18:22:16.97
2018/04/03(火) 18:57:15.26
sedって計算完備なんだっけ。
やろうと思えばsed単体でseq作れるよね
やろうと思えばsed単体でseq作れるよね
2018/04/03(火) 19:03:30.37
sedでlispを作った人はいる
2018/04/03(火) 19:33:57.64
どうかしてるぜ
2018/04/03(火) 22:20:55.54
>>842
使うことないだろうけど感動した
使うことないだろうけど感動した
2018/04/03(火) 23:45:32.30
そんなことより野球やろうぜ
2018/04/04(水) 07:05:11.03
2018/04/05(木) 00:02:39.79
家具家電彼女完備の家に住みたい
2018/04/05(木) 02:42:14.79
sinyabin.shの中でradiru.shを実行しています。
sinyabin.shの中の変数をradiru.shに引き継ぎたいんですが、どう書けばいいんでしょうか?
sinyabin.shの中の変数をradiru.shに引き継ぎたいんですが、どう書けばいいんでしょうか?
853852
2018/04/05(木) 03:31:27.11 radiru.shには、
pushbulettに録音開始の通知
ffmpegを使ってaacのダウンロード
l-smashを使ってaacをm4aに詰め替え
aacの削除
dropboxへm4aのアップロード
ローカルのm4aの削除
pushbulettに録音終了の通知をするコマンドを記入
radiru.shは
$ sinyabin.sh チャンネル 録音時間 ファイル名
で録音出来るようになっているので、
録画したい番組毎にsinyabin.sh等を作りその中に、
$ sinyabin.sh チャンネル 録音時間 ファイル名
を記入しています。
radiru.shの中のl-smashでaacをm4aにする際に番組名やアーティスト名などのタグ付けも一緒にやりたいので、sinyabin.sh側であらかじめl-smashで指定するタグのオプションを記入出来ればと思いました。
pushbulettに録音開始の通知
ffmpegを使ってaacのダウンロード
l-smashを使ってaacをm4aに詰め替え
aacの削除
dropboxへm4aのアップロード
ローカルのm4aの削除
pushbulettに録音終了の通知をするコマンドを記入
radiru.shは
$ sinyabin.sh チャンネル 録音時間 ファイル名
で録音出来るようになっているので、
録画したい番組毎にsinyabin.sh等を作りその中に、
$ sinyabin.sh チャンネル 録音時間 ファイル名
を記入しています。
radiru.shの中のl-smashでaacをm4aにする際に番組名やアーティスト名などのタグ付けも一緒にやりたいので、sinyabin.sh側であらかじめl-smashで指定するタグのオプションを記入出来ればと思いました。
854852
2018/04/05(木) 03:41:17.05 radiru.shはaacのダウンロードだけにして、
Pushbulettへの通知、l-smash、Dropboxなどはsinyabin.shの方に書いたほうがいいんでしょうか?
そうすれば、ちょっと録音したいと思ったときいちいち番組毎のスクリプトをつくりその中にIDタグなど細かく書かなくてもすむから楽かなと。
でもそれだと、番組毎のスクリプトに「Pushbulettへの通知、l-smash、Dropbox」といったコマンドを書かないといけないので無駄かなあとも思いました。
どういうフローがいいと思いますか?
Pushbulettへの通知、l-smash、Dropboxなどはsinyabin.shの方に書いたほうがいいんでしょうか?
そうすれば、ちょっと録音したいと思ったときいちいち番組毎のスクリプトをつくりその中にIDタグなど細かく書かなくてもすむから楽かなと。
でもそれだと、番組毎のスクリプトに「Pushbulettへの通知、l-smash、Dropbox」といったコマンドを書かないといけないので無駄かなあとも思いました。
どういうフローがいいと思いますか?
2018/04/05(木) 10:10:37.31
export すりゃいいんじゃない
2018/04/05(木) 10:22:06.60
こう質問の仕方が下手だと答える気失せるな
変数外に出せばいいだけ
変数外に出せばいいだけ
2018/04/05(木) 10:59:32.39
852だけで良かったのにね
2018/04/05(木) 13:53:42.01
プログラミング素人っぽいし、加減がわかってないだろうから、
情報が多すぎる方は不問にした方が。
足りないよりは多すぎる方がずっとマシ。
情報が多すぎる方は不問にした方が。
足りないよりは多すぎる方がずっとマシ。
2018/04/05(木) 18:12:51.21
>>853
radiru.sh に引数でタグ情報を渡せばいいと思いますが。
radiru.sh に引数でタグ情報を渡せばいいと思いますが。
860名無しさん@お腹いっぱい。
2018/04/12(木) 09:36:41.69 bashだと$LINENOでファイルの中での現在の行数が取得できるのですが、
dashやzshだと関数の中にいる時、関数のはじめからの行数になってしまいます。
どうにかして現在の行数を取得する方法はないでしょうか?
dashやzshだと関数の中にいる時、関数のはじめからの行数になってしまいます。
どうにかして現在の行数を取得する方法はないでしょうか?
2018/04/13(金) 19:02:57.86
zshよくしらんけど、関数定義の手前の行番号を
変数にでも取っといて足し算すりゃいいんじゃね?
変数にでも取っといて足し算すりゃいいんじゃね?
2018/04/13(金) 19:07:33.88
まぁやりようは如何様にでもあるんだろうが、
ニュアンス的に$LINENO並の手軽さで取得する手段はないかってことじゃね
俺は知らん
ニュアンス的に$LINENO並の手軽さで取得する手段はないかってことじゃね
俺は知らん
2018/04/13(金) 22:14:56.99
$LINENOってどういう使い方を想定して作ったんだろうね
2018/04/13(金) 22:51:23.99
どこを見ればPOSIXシェルスクリプトの確かな仕様に出会えるのか知らないけど、
ググって出てきたこれにはLINENO書いてあるな。
User Portability Utilities optionが必要みたいだけど、なにそれ?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
ググって出てきたこれにはLINENO書いてあるな。
User Portability Utilities optionが必要みたいだけど、なにそれ?
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html
2018/04/13(金) 23:40:07.60
実装オプションにつけてあるIDコードの一つみたいだな。
コードの一覧は
ttp://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html
にある。
オプション機能なので、実装されてるとは限らない。
コードの一覧は
ttp://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html
にある。
オプション機能なので、実装されてるとは限らない。
2018/04/14(土) 00:40:09.23
LINENOが仕様どおりに実装されてないのは
この際見なかったことにして、現在使われてる
POSIX準拠シェルで完全に実装されてないものなんて有るの?
そもそも現在使われてるPOSIX準拠シェルってどんなのがあるんだろう
bash、ash、dash、zsh、ksh、mksh、yash、posh
他に知ってる?
この際見なかったことにして、現在使われてる
POSIX準拠シェルで完全に実装されてないものなんて有るの?
そもそも現在使われてるPOSIX準拠シェルってどんなのがあるんだろう
bash、ash、dash、zsh、ksh、mksh、yash、posh
他に知ってる?
2018/04/14(土) 16:31:32.55
$LINENO使って何をしたいんだろ
2018/04/14(土) 19:01:06.26
デバッグログ以外になにかあんの?
だからこそデバッグログとして使えない
$LINENOを何のために作ったのか理解できない
だからこそデバッグログとして使えない
$LINENOを何のために作ったのか理解できない
2018/04/14(土) 19:14:03.26
${(%):-%I}
2018/04/14(土) 20:10:19.92
$ ${(%):-%I}
-bash: ${(%):-%I}: 誤った代入です
-bash: ${(%):-%I}: 誤った代入です
2018/04/17(火) 22:14:01.26
https://ja.wikipedia.org/wiki/IOCCC
> ^ Bourne Shellのソースコード( http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh )は
> マクロ( http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h )を使用した
> 「ALGOLのような見た目のC」で書かれていることで悪名高い
> ^ Bourne Shellのソースコード( http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh )は
> マクロ( http://minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h )を使用した
> 「ALGOLのような見た目のC」で書かれていることで悪名高い
872名無しさん@お腹いっぱい。
2018/04/18(水) 10:39:06.43 自己解凍するファイルって便利だな
シェルスクリプトで解凍とインストール手順を記述して
それをバイナリと結合するだけでmsiみたいなことができる
シェルスクリプトで解凍とインストール手順を記述して
それをバイナリと結合するだけでmsiみたいなことができる
2018/04/18(水) 15:04:27.31
>>872
それはちなみに sh アーカイブ形式って呼び名がついてる。
sharっていう自己解凍シェルスクリプト作成専用コマンドも昔はあった。
なお、ウイルスやマルウェアの温床だということで廃れた模様。
それはちなみに sh アーカイブ形式って呼び名がついてる。
sharっていう自己解凍シェルスクリプト作成専用コマンドも昔はあった。
なお、ウイルスやマルウェアの温床だということで廃れた模様。
2018/04/18(水) 15:22:26.44
sharはそれでインストールまでするというより、tar.gz などのバイナリファイルを
テキストにしてメールやニュースで送るために使うことが多かった
テキストにしてメールやニュースで送るために使うことが多かった
2018/04/18(水) 16:21:07.45
>>874
へー、uuencodeしか知らんかった
へー、uuencodeしか知らんかった
876872
2018/04/18(水) 21:50:42.61 あーわりと昔からある手法なのね……
VMware Horizon Clientのインストールイメージがその形で,俺は正直そういうシェルスクリプトとバイナリが結合されてるファイルを始めて触ったんで
画期的なアイデアに思えたんだわ……
VMware Horizon Clientのインストールイメージがその形で,俺は正直そういうシェルスクリプトとバイナリが結合されてるファイルを始めて触ったんで
画期的なアイデアに思えたんだわ……
2018/04/18(水) 23:47:33.56
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")" ]
これは一致した文字とみなされるようです
こういった挙動はどこを見れば理解できるでしょうか?
とすると/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")" ]
これは一致した文字とみなされるようです
こういった挙動はどこを見れば理解できるでしょうか?
2018/04/18(水) 23:55:18.86
a="$(printf '1\n\n\n')"
とやってもaには1しか入っていない
a="$(printf '1\n\n\n2')"
しかしこうすると5バイト入ってる
その状態から a=${a%?} を末尾の2を削除すると
a には4バイト、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.07 >>877
コマンド置換 $(...) の仕様
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
> 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のマニュアルにも同様の記述がある
http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBC
> bash は command を実行し、 command の標準出力でコマンド置換の部分を
> 置き換えます。この際、末尾の改行文字は削除されます。 文字列の途中に
> ある改行文字は削除されませんが、 単語分割の際に削除されることがあり
> ます。
コマンド置換 $(...) の仕様
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03
> 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のマニュアルにも同様の記述がある
http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBC
> bash は command を実行し、 command の標準出力でコマンド置換の部分を
> 置き換えます。この際、末尾の改行文字は削除されます。 文字列の途中に
> ある改行文字は削除されませんが、 単語分割の際に削除されることがあり
> ます。
2018/04/19(木) 00:06:21.64
かといってこうやると4バイトでてるんだよなー
printf '1\n\n\n' | hexdump.exe -C
printf '1\n\n\n' | hexdump.exe -C
2018/04/19(木) 00:19:37.42
コマンド置換の仕様かぁ
普通のやり方ではコマンドの出力結果を変数に入れるときは
末尾の改行は絶対消えるってことかなー
read使えばって思ったけど、あっちは改行区切りだしなー
ちなみに $aに1\n\n\nを無理やり入れて、
$bに1を入れて [ "$a" = "$b" ] で比較したら不一致になったよ
普通のやり方ではコマンドの出力結果を変数に入れるときは
末尾の改行は絶対消えるってことかなー
read使えばって思ったけど、あっちは改行区切りだしなー
ちなみに $aに1\n\n\nを無理やり入れて、
$bに1を入れて [ "$a" = "$b" ] で比較したら不一致になったよ
2018/04/19(木) 00:24:31.94
あたりまえやろw
2018/04/19(木) 00:54:10.53
よくこんな単純なルールで辻褄取れてるよなー
思いつきで考えたとしか思えないルールなのにw
思いつきで考えたとしか思えないルールなのにw
2018/04/24(火) 02:26:08.83
単純なルールのほうが整合性は取りやすいんでは? 寧ろ複雑な規則だと実装に矛盾が生じたりしそう。
885名無しさん@お腹いっぱい。
2018/04/27(金) 23:17:19.66 ちょっと質問
偶数日と奇数日で処理を分けたいんだけど、上手くできない
どうしたら良いのかアドバイスください
#!/bin/sh
DATE=`date '+%d'` # 日 を取得
buf=$(( $DATE % 2 )) # 計算
if [ ! $buf ]; then # 偶数
hoge
else # 奇数
fuga
fi
偶数日と奇数日で処理を分けたいんだけど、上手くできない
どうしたら良いのかアドバイスください
#!/bin/sh
DATE=`date '+%d'` # 日 を取得
buf=$(( $DATE % 2 )) # 計算
if [ ! $buf ]; then # 偶数
hoge
else # 奇数
fuga
fi
2018/04/27(金) 23:43:49.55
その計算するとこ()の中に$いるっけ
2018/04/28(土) 00:55:01.80
2018/04/28(土) 01:37:16.44
BSDで標準コマンドだけで現在時刻(もしくは起動してからの)ミリ秒ってとれないのな
/proc/uptimeもBSDないみたいだしどうにかして取れないかなー
ファイルに書き込んでタイムスタンプで
取れないかなーとかもやってみたりもしたw
ファイルシステムによっては書き込まれるみたいだが
これも標準コマンドだけでどうやればー
できればなにも入ってない素のコマンドだけでやりたいんだよね
Perlでもやれるけど、dateコマンドに比べたら
起動時間が10倍も違うんだよな。
あ、ベンチマークというかコマンドの実行速度を細かく知りたいために使いたい。
timeコマンドは標準出力(エラーだっけ?)を乱すので使いたくない
/proc/uptimeもBSDないみたいだしどうにかして取れないかなー
ファイルに書き込んでタイムスタンプで
取れないかなーとかもやってみたりもしたw
ファイルシステムによっては書き込まれるみたいだが
これも標準コマンドだけでどうやればー
できればなにも入ってない素のコマンドだけでやりたいんだよね
Perlでもやれるけど、dateコマンドに比べたら
起動時間が10倍も違うんだよな。
あ、ベンチマークというかコマンドの実行速度を細かく知りたいために使いたい。
timeコマンドは標準出力(エラーだっけ?)を乱すので使いたくない
2018/04/28(土) 01:49:17.29
あれとれなかったっけ?
なんか取れた気がしたけど気のせいだったか
なんか取れた気がしたけど気のせいだったか
890名無しさん@お腹いっぱい。
2018/04/28(土) 19:41:21.09 >886-887
ありがとうできたよ。bufが空白になって常にelseに倒れてたから助かりました。
$の位置が良くわからなくて困っていたんだ
Cならいくらでも書けるんだけど、慣れない言語はちょとね・・・
ありがとうできたよ。bufが空白になって常にelseに倒れてたから助かりました。
$の位置が良くわからなくて困っていたんだ
Cならいくらでも書けるんだけど、慣れない言語はちょとね・・・
2018/04/28(土) 20:34:44.86
>>888
timeコマンドの出力は標準エラーだよ。
標準出力の方は乱さない。
標準エラーが乱れる方も
(time sh -c '測りたいコマンド 2>&3' 2>/tmp/time.out ) 3>&2
みたいにすれば回避できるから、素直に time コマンド使う方がいい。
timeコマンドの出力は標準エラーだよ。
標準出力の方は乱さない。
標準エラーが乱れる方も
(time sh -c '測りたいコマンド 2>&3' 2>/tmp/time.out ) 3>&2
みたいにすれば回避できるから、素直に time コマンド使う方がいい。
2018/04/28(土) 23:27:39.64
2018/04/29(日) 00:02:10.75
まあ使えないわけじゃないし候補にはなるけど、
OSごとに処理分けるの嫌だなぁ
OSごとに処理分けるの嫌だなぁ
2018/04/29(日) 00:07:48.59
/bin/timeって明示すれば?
2018/04/29(日) 02:10:30.87
もしくは
command -p time
command -p time
2018/04/29(日) 08:34:10.39
いや、だからtimeコマンドだと
シェル関数扱えないからだめだって言ってるやん?
シェル関数扱えないからだめだって言ってるやん?
2018/04/29(日) 11:24:09.19
放置で
2018/04/29(日) 18:50:59.66
どうぞ
2018/04/30(月) 09:52:20.53
mkfifo便利すぎる
900名無しさん@お腹いっぱい。
2018/04/30(月) 10:17:56.64 シェルスクリプトの入門書を教えてください
ソフトバンクから出てるUNIXシェルスクリプト〜みたいな書名のものがAmazonでは評価高いみたいなんですが…
先輩方のおすすめを教えてください
ソフトバンクから出てるUNIXシェルスクリプト〜みたいな書名のものがAmazonでは評価高いみたいなんですが…
先輩方のおすすめを教えてください
901名無しさん@お腹いっぱい。
2018/04/30(月) 14:27:06.11 >>900
こういう分野に関してはいまだにオライリーは信頼できる書籍を発行してるぜ。
まあ俺の持論だがw
https://www.oreilly.co.jp/books/4873112672/
↑これとか参考になる。コマンドの列挙だけじゃなく、システムとシェルの性質とか非常に基礎的な部分から触れてるのでよい(と思う)。
こういう分野に関してはいまだにオライリーは信頼できる書籍を発行してるぜ。
まあ俺の持論だがw
https://www.oreilly.co.jp/books/4873112672/
↑これとか参考になる。コマンドの列挙だけじゃなく、システムとシェルの性質とか非常に基礎的な部分から触れてるのでよい(と思う)。
902900
2018/04/30(月) 16:27:23.982018/05/02(水) 16:02:31.91
コマンドの出力結果を一時ファイルを作らずに
一行一変数に入れたいんですけどいい方法はないでしょうか?
変数はLINE1、LINE2・・・みたいな名前で
bash依存になる配列は使わない方針です。
foo | while read -r line; do
LINE1=$line
done
みたいにするとサブシェルだから
ループ終わると消えてしまうし
一行一変数に入れたいんですけどいい方法はないでしょうか?
変数はLINE1、LINE2・・・みたいな名前で
bash依存になる配列は使わない方針です。
foo | while read -r line; do
LINE1=$line
done
みたいにするとサブシェルだから
ループ終わると消えてしまうし
2018/05/02(水) 16:34:46.41
sedかawkで代入文いっぱい出してevalかな。
特殊文字のエスケープちゃんと書かないといけないけど。
特殊文字のエスケープちゃんと書かないといけないけど。
2018/05/02(水) 16:42:46.69
cat <<. |
1st Line
2nd Line
3rd Line
.
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s%s' 'LINE'"${ctlino}"'='"$(printf '%s' "'")""${lineval}""$(printf '%s' "'")" ';'
done |
printf '%s%s\n' "$(cat)" ':'
とりあえずこうすると
LINE1='1st Line';LINE2='2nd Line';LINE3='3rd Line';:
という出力が得られる。これを評価すればいいと思ったができねえ。
1st Line
2nd Line
3rd Line
.
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s%s' 'LINE'"${ctlino}"'='"$(printf '%s' "'")""${lineval}""$(printf '%s' "'")" ';'
done |
printf '%s%s\n' "$(cat)" ':'
とりあえずこうすると
LINE1='1st Line';LINE2='2nd Line';LINE3='3rd Line';:
という出力が得られる。これを評価すればいいと思ったができねえ。
2018/05/02(水) 16:59:04.80
改良?
cat <<'EOF' |
1st Line
2nd Li'ne
3rd Line
EOF
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s' "${lineval}" |
sed 's/'"'"'/'"'"'"&"'"'"'/g' |
printf '%s%s' 'LINE'"${ctlino}"'='"'""$(cat)""'" '; '
done
→ LINE1='1st Line'; LINE2='2nd Li'"'"'ne'; LINE3='3rd Line'; :
cat <<'EOF' |
1st Line
2nd Li'ne
3rd Line
EOF
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s' "${lineval}" |
sed 's/'"'"'/'"'"'"&"'"'"'/g' |
printf '%s%s' 'LINE'"${ctlino}"'='"'""$(cat)""'" '; '
done
→ LINE1='1st Line'; LINE2='2nd Li'"'"'ne'; LINE3='3rd Line'; :
2018/05/02(水) 17:00:08.10
改良?
cat <<'EOF' |
1st Line
2nd Li'ne
3rd Line
EOF
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s' "${lineval}" |
sed 's/'"'"'/'"'"'"&"'"'"'/g' |
printf '%s%s' 'LINE'"${ctlino}"'='"'""$(cat)""'" '; '
done |
printf '%s%s\n' "$(cat)" ':'
とりあえず単引用符のエスケープだけ。他にも必要なものがあればsedを挟んでいけばいいんでは。
cat <<'EOF' |
1st Line
2nd Li'ne
3rd Line
EOF
while read -r lineval; do
ctlino=$((ctlino + 1))
printf '%s' "${lineval}" |
sed 's/'"'"'/'"'"'"&"'"'"'/g' |
printf '%s%s' 'LINE'"${ctlino}"'='"'""$(cat)""'" '; '
done |
printf '%s%s\n' "$(cat)" ':'
とりあえず単引用符のエスケープだけ。他にも必要なものがあればsedを挟んでいけばいいんでは。
2018/05/02(水) 17:12:01.86
> sedかawkで代入文いっぱい出してevalかな。
やっぱり残る手はそれか
やっぱり残る手はそれか
2018/05/02(水) 17:18:49.70
$ radico rec -id=FMT -s=20180502040000
というコマンドがあったとして、「-s=」あとに今日の朝4時「date +"%Y%m%d"040000」の結果を入れたいんですが、一行で書く方法を教えてください
というコマンドがあったとして、「-s=」あとに今日の朝4時「date +"%Y%m%d"040000」の結果を入れたいんですが、一行で書く方法を教えてください
2018/05/02(水) 17:28:29.77
お前はこの前のレス群に対する結果とか報告してからにしろ
2018/05/02(水) 18:12:16.93
何も考えずぶん投げるけど変数exportとかじゃだめなのか
2018/05/02(水) 18:28:09.05
出来ました!
2018/05/02(水) 19:53:51.97
2018/05/02(水) 21:09:33.58
引数 $1 $2 $3 ・・・ のうち、特定の範囲n〜mを
別の関数の引数に渡すのってどうやればいいだろうか?
n〜mは条件で変わるものとする
別の関数の引数に渡すのってどうやればいいだろうか?
n〜mは条件で変わるものとする
2018/05/02(水) 21:27:56.41
2018/05/02(水) 21:34:19.62
2018/05/02(水) 22:27:50.67
shift $argnum
とかは?
とかは?
2018/05/02(水) 22:47:14.90
2018/05/02(水) 22:51:49.30
bashだとこんな感じですね
foo() { echo "${@:2:3}"; }
$ foo 1 2 3 4 5
2 3 4
foo() { echo "${@:2:3}"; }
$ foo 1 2 3 4 5
2 3 4
2018/05/03(木) 00:40:42.42
>>918
for文使えば?
selectargnum()
{
fromargnum=$1
toargnum=$2
shift ${fromargnum}
for arg in $(seq $((toargnum - fromargnum + 1))); do
printf '%s\n' "$2" && shift
done
}
selectargnum 3 5 "$@"
注意: シェル函数への第1,2引数は必ず非負整数で,引数の範囲内であるべし。
for文使えば?
selectargnum()
{
fromargnum=$1
toargnum=$2
shift ${fromargnum}
for arg in $(seq $((toargnum - fromargnum + 1))); do
printf '%s\n' "$2" && shift
done
}
selectargnum 3 5 "$@"
注意: シェル函数への第1,2引数は必ず非負整数で,引数の範囲内であるべし。
2018/05/03(木) 00:47:51.26
#! /bin/sh -
selectargnum()
{
fromargnum=$1
toargnum=$2
shift ${fromargnum}
for arg in $(seq $((toargnum - fromargnum + 1))); do
printf '%s\n' "$2"
shift
done
}
selectargnum 2 4 "$@"
もうちょっと親切に書くわ。
シェル函数selectargnumの
::仕様::
selectargnum <開始位置> <終了位置> <(処理したい)引数>
開始位置・終了位置は省略不可で,常識的な範囲であることを前提にしている。
::使い方::
上のコードを適当な名前のファイル(例えばselarg.sh)に保存して実行権限を賦与。
$ chmod +x ./selarg.sh
あとはファイル中のselectargnum函数の第1,2引数を書き換えて使える。
上の例なら
$ ./selarg.sh "第1引数" "第2引数" "第3引数" "第4引数" "第5引数"
に対して
第2引数
第3引数
第4引数
という出力が得られる。
selectargnum()
{
fromargnum=$1
toargnum=$2
shift ${fromargnum}
for arg in $(seq $((toargnum - fromargnum + 1))); do
printf '%s\n' "$2"
shift
done
}
selectargnum 2 4 "$@"
もうちょっと親切に書くわ。
シェル函数selectargnumの
::仕様::
selectargnum <開始位置> <終了位置> <(処理したい)引数>
開始位置・終了位置は省略不可で,常識的な範囲であることを前提にしている。
::使い方::
上のコードを適当な名前のファイル(例えばselarg.sh)に保存して実行権限を賦与。
$ chmod +x ./selarg.sh
あとはファイル中のselectargnum函数の第1,2引数を書き換えて使える。
上の例なら
$ ./selarg.sh "第1引数" "第2引数" "第3引数" "第4引数" "第5引数"
に対して
第2引数
第3引数
第4引数
という出力が得られる。
2018/05/03(木) 00:50:36.20
seqを除いてPOSIX準拠。
もしもより厳密にPOSIXに従いたければ当該箇所を
seq $((toargnum - fromargnum + 1))
から
yes | head -n $((toargnum - fromargnum + 1))
としてもいいだろう。
もしもより厳密にPOSIXに従いたければ当該箇所を
seq $((toargnum - fromargnum + 1))
から
yes | head -n $((toargnum - fromargnum + 1))
としてもいいだろう。
2018/05/03(木) 03:17:05.15
>>919のせいで勘違いさせたようですね
> 別の関数の引数に渡すのってどうやればいいだろうか?
重要なのはこれ
another_function() {
for i in "$@"; do
printf "%s\n" "$i"
done
}
foo() { another_function "${@:2:3}"; }
another_functionはそのまま使って、
fooの部分をPOSIX準拠にして
以下のような出力を得たいということです
$ foo a "b 1" "c 1" d e
b 1
c 1
d
> 別の関数の引数に渡すのってどうやればいいだろうか?
重要なのはこれ
another_function() {
for i in "$@"; do
printf "%s\n" "$i"
done
}
foo() { another_function "${@:2:3}"; }
another_functionはそのまま使って、
fooの部分をPOSIX準拠にして
以下のような出力を得たいということです
$ foo a "b 1" "c 1" d e
b 1
c 1
d
2018/05/03(木) 03:18:03.35
eval使うしか無いっすかね?
レス数が900を超えています。1000を超えると表示できなくなるよ。
ニュース
- 日中対立、打開策見えず 高市氏答弁1カ月、影響拡大 ★2 [蚤の市★]
- 小林よしのり 日中関係、来年は「ますます日本は不利に」「加害者の分際で被害者ぶって、中国が横暴だと毅然と振る舞っても滑稽なだけ」 [冬月記者★]
- 2026年はゲーム機やPC、スマホが一斉値上げか メモリ大手ブランド「Crucial」廃止の衝撃 [樽悶★]
- 【サッカー】カズ・三浦知良、現役続行を表明 SNSで『引退勧告』殺到も… 対戦した選手「スピード、キレはないが体の使い方はうまい」 [冬月記者★]
- 『DOWNTOWN+』2回目生配信で松本の実兄・松本隆博が登場し共演 [jinjin★]
- 元グラドル維新議員 夫に「サンドイッチのパン」を依頼→食パン6枚切り買われ怒り…“どちらが悪い?”SNSで議論 ★3 [muffin★]
- 友人の行動がかなりモヤっとした。みんなの意見聞かせて
- VIPPERの趣味てアニメゲームVTuberしかないよなそれらのスレばっか
- 寝れんからだれか話そう
- 国民・玉木雄一郎「日本は台湾を国家として正式に承認していないため、台湾への攻撃だけでは存立危機事態にはなりません」と世界に発信 [594040874]
- マクドナルドのバイトが時給4300円を突破。さすがにアメリカ人もビビり始める [858219337]
- おバカなリズム🎶とおバカなダンス💃で、サタデーナイト🌃にバカテンポ🏡
