シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
前スレ: シェルスクリプト総合 その27(https://mevius.5ch.net/test/read.cgi/unix/1525337663/)
シェルスクリプト総合 その28
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2018/07/24(火) 11:01:16.36ID:r0TJj2hB2018/07/24(火) 11:02:04.48ID:r0TJj2hB
初心者へのアドバイス
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
・適した道具を判断するのも頭の重要な使い方。
シェルスクリプトよりもPerlまたはPythonの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらman(1)を引きましょう。
・思い通りに動かないときは、まずはsh(1)の-xオプションでトレースしましょう。
回答者への注意事項
・相手がシェルスクリプトでの処理方法を質問しているのにもかかわらず、よく知りもせずに、「そういうのはPerl, Python使え」と回答するのはやめましょう。
安易にPerlやPythonに逃げずに小さなコマンドを組み合わせシェルスクリプトで処理するのが頭のいいやり方。
・質問に対して問題が間違ってるといちゃもんをつけるのも避けましょう。
2018/07/24(火) 11:05:09.89ID:r0TJj2hB
補足(今スレ限り)
いままではUNIX板でスレ立てをしていましたが、IDやワッチョイが無いことを理由とした自演・荒しが目立ってきておりスレがまともに機能しなくなりかけているので、今回よりプログラム板に移動することになりました。
いままではUNIX板でスレ立てをしていましたが、IDやワッチョイが無いことを理由とした自演・荒しが目立ってきておりスレがまともに機能しなくなりかけているので、今回よりプログラム板に移動することになりました。
2018/07/24(火) 14:22:58.96ID:r0TJj2hB
とりあえず保守っぽい書き込み
2018/07/24(火) 15:29:38.59ID:4yafhCFC
おつ
2018/07/24(火) 15:31:12.93ID:ux1Ayazo
り返せ
2018/07/24(火) 16:40:14.98ID:PsBikv9p
ません
2018/07/24(火) 16:45:11.85ID:dOWUO1eS
m9
2018/07/24(火) 20:36:43.40ID:0V9luMBh
>>1
スレ立て乙!111
スレ立て乙!111
2018/07/24(火) 21:04:07.46ID:ux1Ayazo
112
2018/07/24(火) 22:37:58.80ID:ukUjoRN2
>1 乙
支援
支援
2018/07/25(水) 01:58:18.49ID:41CwtA3+
乙なんよ
2018/07/25(水) 02:54:55.73ID:7zvfAEGp
テンプレの↓
> 自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?
ちょっと痛いかな
> 自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?
ちょっと痛いかな
2018/07/25(水) 03:03:02.74ID:JJXqrWB8
bashのあれやこれは、shでどうかけばいいかってのがあるといいな
特に配列。配列は引数として処理するんだよっていうのが体系的にまとまるといいな
特に配列。配列は引数として処理するんだよっていうのが体系的にまとまるといいな
2018/07/25(水) 08:44:11.14ID:go981At1
本来の引数配列以外で配列が必要になったら、基本的にはawkその他の言語使うなあ。
まあ自分用だと気の迷いで引数配列転用したり、evalで頑張ったりすることもあるけど、
仕事で他の人に引き継ぐこと考えると保守性で問題になるので
仕事ではやらないようにしてる。
まあ自分用だと気の迷いで引数配列転用したり、evalで頑張ったりすることもあるけど、
仕事で他の人に引き継ぐこと考えると保守性で問題になるので
仕事ではやらないようにしてる。
2018/07/25(水) 15:17:48.54ID:JJXqrWB8
>>16
配列が必要になるっていうのは、シェルスクリプトの
プログラミングの仕方が間違えてるってことだよ
例えて言うならば、関数型言語をオブジェクト指向言語的に
使って、オブジェクト使いたい。インスタンス作りたい
メソッド作りたい、継承、カプセル化欲しい!って言うようなもん
シェルスクリプトは引数または標準入力で渡されたものを
順次処理していくという書き方をするもんなんだろう。
一時的に変数にためておくなんてことはしないので
配列は使わないですむ
配列が必要になるっていうのは、シェルスクリプトの
プログラミングの仕方が間違えてるってことだよ
例えて言うならば、関数型言語をオブジェクト指向言語的に
使って、オブジェクト使いたい。インスタンス作りたい
メソッド作りたい、継承、カプセル化欲しい!って言うようなもん
シェルスクリプトは引数または標準入力で渡されたものを
順次処理していくという書き方をするもんなんだろう。
一時的に変数にためておくなんてことはしないので
配列は使わないですむ
2018/07/25(水) 15:24:58.23ID:eezz2RvW
evalだけは怖いから使わない
それでしか解決できない問題をまだ扱った事がないからだが
それでしか解決できない問題をまだ扱った事がないからだが
2018/07/25(水) 15:32:42.01ID:JJXqrWB8
evalは信頼できない文字をevalするのが問題なのであって
コードの中で作り出した文字をevalするなら問題もないんだよ
信頼できない文字であっても、使える文字種を限定すればいいし
コードの中で作り出した文字をevalするなら問題もないんだよ
信頼できない文字であっても、使える文字種を限定すればいいし
2018/07/25(水) 17:47:06.73ID:7zvfAEGp
あるリモートファイルの最新のバージョンをダウンロードする方法ってありますか。
具体的にはhttp://ftp.jaist.ac.jp/pub/GNU/gnuzilla/←ここの最新バージョンのディレクトリを知りたいです。
具体的にはhttp://ftp.jaist.ac.jp/pub/GNU/gnuzilla/←ここの最新バージョンのディレクトリを知りたいです。
2018/07/25(水) 17:59:04.34ID:DddK84yb
ある
2018/07/25(水) 21:12:21.99ID:l3Vcc9bz
2018/07/25(水) 21:32:58.42ID:tKZkTFhc
極端な例を挙げるなら、行列演算をシェルスクリプトで書く馬鹿はいないみたいな話よ。
配列に限った話ではなく、ほとんど全ての高級言語にあるのにシェルにはない言語機能がいろいろある。
例えば構造体に類する機能とか、参照とか。
言語には向き不向きがあって、シェルでは向いてない用途に無理矢理使うのは井の中の蛙。
配列に限った話ではなく、ほとんど全ての高級言語にあるのにシェルにはない言語機能がいろいろある。
例えば構造体に類する機能とか、参照とか。
言語には向き不向きがあって、シェルでは向いてない用途に無理矢理使うのは井の中の蛙。
2018/07/25(水) 22:46:32.67ID:c/fHfsdl
>>21
wget -qO - 'http://ftp.jaist.ac.jp/pub/GNU/gnuzilla/?C=M;O=D' | grep -m1 -Po '\[DIR\].+?href="\K[0-9.]+'
wget -qO - 'http://ftp.jaist.ac.jp/pub/GNU/gnuzilla/?C=M;O=D' | grep -m1 -Po '\[DIR\].+?href="\K[0-9.]+'
2018/07/27(金) 11:44:05.25ID:+pgu0NCD
2018/07/27(金) 15:01:43.20ID:GvW3yrkV
できるだけ可搬なUNIX時間<->ISO 8601形式時間の変換器ってどんなのがありますかね
PerlやRubyでいけるのは知っていますが,もうちょっとPOSIXに従ってるやり方が知りたいです
PerlやRubyでいけるのは知っていますが,もうちょっとPOSIXに従ってるやり方が知りたいです
2018/07/27(金) 15:34:58.00ID:2MP7doyF
>>28
GNU date 限定の技だと思うのであまり嬉しくないかもしれないけど、以下のコマンドでいけるそうだ。
date --date "@1501201492" +"%Y%m%dT%H%M%SZ"
ちなみに出典は以下の記事です。
dateコマンドを使ってUnixTimeをISO8601形式へ変換する - Qiita
https://qiita.com/EDAPIYO/items/1bf163604006fd667988
GNU date 限定の技だと思うのであまり嬉しくないかもしれないけど、以下のコマンドでいけるそうだ。
date --date "@1501201492" +"%Y%m%dT%H%M%SZ"
ちなみに出典は以下の記事です。
dateコマンドを使ってUnixTimeをISO8601形式へ変換する - Qiita
https://qiita.com/EDAPIYO/items/1bf163604006fd667988
2018/07/27(金) 15:42:57.75ID:2MP7doyF
>>28
小出しでスマン。こういうオプションもあるみたいなんだけど、man に記載されてないね……
$ date --date "@1501201492" --iso-8601=seconds
2017-07-28T09:24:52+0900
小出しでスマン。こういうオプションもあるみたいなんだけど、man に記載されてないね……
$ date --date "@1501201492" --iso-8601=seconds
2017-07-28T09:24:52+0900
2018/07/27(金) 16:35:57.77ID:GvW3yrkV
>>29
ありがとうございます。
そうっすね……。dateコマンドでできるのは知っていますが,
これ,ものっすごく可搬性悪いんですよ。下手するとPerlでやったほうがマシなくらい。
なぜかというと,各種OSによってdateコマンドのUNIX時間<->ISO 8601形式時間変換のオプションが違うんです。
*BSDはdate -jだしGNU/Linuxでは書いてもらったdate --dateとかdate -dとか。
ある種のOSではdate -rもあるっぽいです……。
ありがとうございます。
そうっすね……。dateコマンドでできるのは知っていますが,
これ,ものっすごく可搬性悪いんですよ。下手するとPerlでやったほうがマシなくらい。
なぜかというと,各種OSによってdateコマンドのUNIX時間<->ISO 8601形式時間変換のオプションが違うんです。
*BSDはdate -jだしGNU/Linuxでは書いてもらったdate --dateとかdate -dとか。
ある種のOSではdate -rもあるっぽいです……。
2018/07/27(金) 20:53:36.25ID:5PTGcdNX
33デフォルトの名無しさん
2018/07/31(火) 09:25:51.28ID:nOeIYYJj2018/07/31(火) 09:56:38.03ID:2+1mdxB2
自力で作るならコマンド見分けたほうが楽だなw
どちらも同じオプションだけど意味が違うものを使って見分ける
どちらも同じオプションだけど意味が違うものを使って見分ける
2018/07/31(火) 11:29:27.77ID:3VAn/oI8
>>31
自分で言ってる様に Perl で書いちゃえば良いような…
自分で言ってる様に Perl で書いちゃえば良いような…
2018/07/31(火) 19:49:30.25ID:M5dn2TAr
自分で足し算すると、サマータイム・うるう秒は、大丈夫なのか?
2018/07/31(火) 20:11:42.59ID:qTamNnJo
bashです。
aa.shからbb.shを呼び出した時、リダイレクトでログを残したいんだけどうまく行かない。
なにか間違っているでしょうか?
(aa.sh)
#!/bin/bash
b_shell="./bb.sh"
cmd="${b_shell} > ./bb.log"
${cmd}
(bb.sh)
#!/bin/bash
echo "hoge"
aa.shからbb.shを呼び出した時、リダイレクトでログを残したいんだけどうまく行かない。
なにか間違っているでしょうか?
(aa.sh)
#!/bin/bash
b_shell="./bb.sh"
cmd="${b_shell} > ./bb.log"
${cmd}
(bb.sh)
#!/bin/bash
echo "hoge"
2018/07/31(火) 20:15:49.79ID:6LkeIiyI
何か間違ってるんだろ
2018/07/31(火) 20:18:57.37ID:qTamNnJo
どこを変更したら動くの?
2018/07/31(火) 21:14:19.18ID:1f/UcTRP
想定通りの動きをしてない行
2018/07/31(火) 21:14:23.24ID:MEUSBOQW
eval ${cmd}
2018/07/31(火) 21:16:43.59ID:MEUSBOQW
bb.sh で
echo "$*"
してみりゃ、理解できるだろう
echo "$*"
してみりゃ、理解できるだろう
2018/07/31(火) 21:24:56.48ID:qTamNnJo
>>41
サンクス!できたw
サンクス!できたw
2018/07/31(火) 21:27:46.12ID:MZe54JNj
>>43
cmdに代入しなきゃダメなの?
cmdに代入しなきゃダメなの?
2018/07/31(火) 22:50:34.87ID:nOeIYYJj
>>36
確かそういうのを考慮してないんじゃないの?
確かそういうのを考慮してないんじゃないの?
2018/07/31(火) 22:58:00.65ID:RprViRTw
>>45
うるう秒はUNIX Epochからの秒数には入ってないので無視して良い。
サマータイムやタイムゾーンの考慮は必要だしとても大変。
日本のタイムゾーン固定ならサマータイムも今のところ無視できるし簡単だけど、perlでも使ってライブラリに任せた方がいいと思う。
うるう秒はUNIX Epochからの秒数には入ってないので無視して良い。
サマータイムやタイムゾーンの考慮は必要だしとても大変。
日本のタイムゾーン固定ならサマータイムも今のところ無視できるし簡単だけど、perlでも使ってライブラリに任せた方がいいと思う。
2018/07/31(火) 23:52:51.22ID:nOeIYYJj
どうでもいいが俺のID末尾がjってなんだこれ
2018/08/01(水) 08:18:10.49ID:4ZTIK2TR
>>47
この板のIDは8桁だから9桁目(いわゆる末尾)はないよ
この板のIDは8桁だから9桁目(いわゆる末尾)はないよ
49デフォルトの名無しさん
2018/08/01(水) 11:52:30.09ID:cj6lI2dq 昨日発見した事なんだけど、シェルというよりは test コマンドの問題だけど、test -f で対象のファイルを指定しない時って0になるのな。
これはbash用に書かれたこんな記述の時の動作によって気づいた。
if [ ! -f $file ]; then
echo ファイルなし
exit 1
fi
これで file に何も代入されてないとか空文字列の時にファイルなしにならない。
なんだこの動作は?
testコマンドの仕様?たまたま俺の使ってたLinuxのtestコマンドのバグ?
まあbashなら[[ ]] 使っとけばエラーになるからそっち使っておけば良いんだけどね。
これはbash用に書かれたこんな記述の時の動作によって気づいた。
if [ ! -f $file ]; then
echo ファイルなし
exit 1
fi
これで file に何も代入されてないとか空文字列の時にファイルなしにならない。
なんだこの動作は?
testコマンドの仕様?たまたま俺の使ってたLinuxのtestコマンドのバグ?
まあbashなら[[ ]] 使っとけばエラーになるからそっち使っておけば良いんだけどね。
2018/08/01(水) 12:14:18.97ID:sWzzPqiz
testの仕様。
"" で囲まなかったのが悪い。
"" で囲まなかったのが悪い。
2018/08/01(水) 12:31:44.03ID:GtWBM62w
find [xxx] -type f | xargs grep [yyy]
をよく使うので
search xxx yyy みたいな alias にしたいんですけど
引数を途中に挟むのってどうすればいいんでしょうか
をよく使うので
search xxx yyy みたいな alias にしたいんですけど
引数を途中に挟むのってどうすればいいんでしょうか
52デフォルトの名無しさん
2018/08/01(水) 12:34:38.30ID:cj6lI2dq53デフォルトの名無しさん
2018/08/01(水) 12:43:22.75ID:cj6lI2dq >>51
bash の場合は function で定義するしかないようだよ。ググって探してみな。
bash の場合は function で定義するしかないようだよ。ググって探してみな。
2018/08/01(水) 14:48:58.76ID:GtWBM62w
2018/08/01(水) 14:58:33.41ID:RF/jFH0Y
2018/08/01(水) 15:09:30.95ID:Al4aQLEL
>>51は grep -r [yyy] [xxx] もしくは rgrep [yyy] [xxx] でいいんじゃねーの?
俺はagの方をよく使うが
俺はagの方をよく使うが
2018/08/01(水) 15:16:54.25ID:Al4aQLEL
>>49
そもそも if [ ! -f $file ]; then だと $fileにスペース等が入っている時に
対応できないので "$file" と書くのは必須
更に言うなら set -u すればいい。$file が空のときはエラーになる
そもそも if [ ! -f $file ]; then だと $fileにスペース等が入っている時に
対応できないので "$file" と書くのは必須
更に言うなら set -u すればいい。$file が空のときはエラーになる
2018/08/01(水) 15:25:42.75ID:RF/jFH0Y
0 arguments:
Exit false (1).
1 argument:
Exit true (0) if $1 is not null; otherwise, exit false.
って、だけなんだけどな。2 arguments から本格的に判定に入るってとこかな。演算子が有効なものなのかも含めて
Exit false (1).
1 argument:
Exit true (0) if $1 is not null; otherwise, exit false.
って、だけなんだけどな。2 arguments から本格的に判定に入るってとこかな。演算子が有効なものなのかも含めて
2018/08/01(水) 15:35:17.39ID:RF/jFH0Y
ああ、1 argumentの場合は空文字列でないかどうかっていうテストになるのか。そう思えば不思議でも何でもないな。使わないけどw
歴史的にそんなのがあっても不思議ではないな、実際どうなのか知らんけど
歴史的にそんなのがあっても不思議ではないな、実際どうなのか知らんけど
60デフォルトの名無しさん
2018/08/01(水) 23:58:14.58ID:GZaAdjmn # set variable identifying the chroot you work in (used in the prompt below)
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
これは、~/.bashrc だけど、
変数中に空白があっても良いように、たいてい変数は" " で囲む。
一方、固定値は囲まない
こういうように、シェルスクリプトには様々な引掛けあるから、危険!
Ruby などのプログラミング言語を勧める
マンガの「Linux シス管系女子3」に書いてあるけど、
「rm -f $file」と変数を" " で囲わなかったので、
「; rm -rf shared」というファイルがあったため、
rm -f ; rm -rf shared
と文がつながって、共有フォルダのファイルがすべて消えてしまったとかw
if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
これは、~/.bashrc だけど、
変数中に空白があっても良いように、たいてい変数は" " で囲む。
一方、固定値は囲まない
こういうように、シェルスクリプトには様々な引掛けあるから、危険!
Ruby などのプログラミング言語を勧める
マンガの「Linux シス管系女子3」に書いてあるけど、
「rm -f $file」と変数を" " で囲わなかったので、
「; rm -rf shared」というファイルがあったため、
rm -f ; rm -rf shared
と文がつながって、共有フォルダのファイルがすべて消えてしまったとかw
2018/08/02(木) 00:06:27.75ID:LJtboBWc
6260
2018/08/02(木) 00:07:43.15ID:yvP4ulwr だから、ディレクトリパス・ユーザー名とか、
システムで使うものに、半角空白を入れたら、ダメ
シェルスクリプトを書いている奴が、変数を" " で囲んでいないと、バグるから
パスに半角空白を入れないようにって、
Mac ユーザーにも、よく言われる
Windows には、半角空白が入ったフォルダ名があるから、危険
システムで使うものに、半角空白を入れたら、ダメ
シェルスクリプトを書いている奴が、変数を" " で囲んでいないと、バグるから
パスに半角空白を入れないようにって、
Mac ユーザーにも、よく言われる
Windows には、半角空白が入ったフォルダ名があるから、危険
6360
2018/08/02(木) 00:12:09.87ID:yvP4ulwr >60 は、
日経Linux で連載している、Piro の有名なマンガ、
「Linux シス管系女子3」に書いてある
このマンガを知らなかったら、もぐりw
日経Linux で連載している、Piro の有名なマンガ、
「Linux シス管系女子3」に書いてある
このマンガを知らなかったら、もぐりw
2018/08/02(木) 00:35:21.87ID:4n+0BAwB
2018/08/02(木) 00:47:05.64ID:aFy8Ou9l
実際に試してみればええんじゃないの
$ mkdir shared
$ touch '; rm -rf'
$ ls
'; rm -rf shared' shared/
$ for file in *;do rm -f $file; done
$ ls
'; rm -rf shared'
$ mkdir shared
$ ls
'; rm -rf shared' shared/
$ for file in *;do rm -f "$file"; done
rm: cannot remove 'shared': Is a directory
$ ls
shared/
$ mkdir shared
$ touch '; rm -rf'
$ ls
'; rm -rf shared' shared/
$ for file in *;do rm -f $file; done
$ ls
'; rm -rf shared'
$ mkdir shared
$ ls
'; rm -rf shared' shared/
$ for file in *;do rm -f "$file"; done
rm: cannot remove 'shared': Is a directory
$ ls
shared/
2018/08/02(木) 00:51:46.28ID:dc2nLErP
6760
2018/08/02(木) 01:12:36.09ID:yvP4ulwr 日経Linux は、Ruby の作者・Matz と、マンガの「シス管系女子」の連載が有名
「シス管系女子」も、もう3冊目。
たいてい本屋の目立つ所に置いてある
システム管理者の必須本
「シス管系女子」も、もう3冊目。
たいてい本屋の目立つ所に置いてある
システム管理者の必須本
2018/08/02(木) 01:20:26.73ID:AdBDijUE
坂本文さんの 「たのしいUNIX」なら知ってる
2018/08/02(木) 01:47:58.08ID:dc2nLErP
>>67
それ以上システム管理者とやらを貶めるなよw
それ以上システム管理者とやらを貶めるなよw
2018/08/02(木) 03:58:43.02ID:tOum0Ceh
>>60
> 変数中に空白があっても良いように、たいてい変数は" " で囲む。
> 一方、固定値は囲まない
固定値だから囲まないんじゃなくて、
固定値かつ、空白が含まれてないから囲ってないだけ
固定値でも、空白が含まれていれば囲む
> 変数中に空白があっても良いように、たいてい変数は" " で囲む。
> 一方、固定値は囲まない
固定値だから囲まないんじゃなくて、
固定値かつ、空白が含まれてないから囲ってないだけ
固定値でも、空白が含まれていれば囲む
2018/08/02(木) 04:04:23.88ID:tOum0Ceh
>>62
> Windows には、半角空白が入ったフォルダ名があるから、危険
危険なんじゃなくて、半角空白が入ったフォルダがあるから
きちんと対応せざるを得なくなってバグが減る
下手に半角空白がないシステムばかり使っていたら
半角空白に対応するのを忘れてしまう。そっちのほうが危険。
そんなことよりもshellcheckでチェックするほうが常識
これを知らないやつはモーグリ
> Windows には、半角空白が入ったフォルダ名があるから、危険
危険なんじゃなくて、半角空白が入ったフォルダがあるから
きちんと対応せざるを得なくなってバグが減る
下手に半角空白がないシステムばかり使っていたら
半角空白に対応するのを忘れてしまう。そっちのほうが危険。
そんなことよりもshellcheckでチェックするほうが常識
これを知らないやつはモーグリ
2018/08/02(木) 04:16:33.42ID:tOum0Ceh
>>60
> こういうように、シェルスクリプトには様々な引掛けあるから、危険!
> Ruby などのプログラミング言語を勧める
Rubyは外部コマンドを呼び出すのがすごく面倒くさい言語だが
参考 https://qiita.com/zakuroishikuro/items/3ab4476ff53f50a163be
> _人人人人人人_
> > めんどい <
>  ̄Y^Y^Y^Y^Y ̄
``を使えば、最小2文字の追加で呼び出すことができる
(正確にはputsしないと標準出力は表示されないからスペース入れて7文字)
Rubyでも結局同じ問題が起きる
# ruby −e Vdir=Wa bW; `ls −al #{dir}`V
ls: cannot access VaV: No such file or directory
ls: cannot access VbV: No such file or directory
(全角なのは書き込みエラーが出たから。もう面倒だから一律変換する)
回避策はいちいち言わなくていい、そんなのあるの知ってる。
Rubyでも様々な引掛けがあるという話。
> こういうように、シェルスクリプトには様々な引掛けあるから、危険!
> Ruby などのプログラミング言語を勧める
Rubyは外部コマンドを呼び出すのがすごく面倒くさい言語だが
参考 https://qiita.com/zakuroishikuro/items/3ab4476ff53f50a163be
> _人人人人人人_
> > めんどい <
>  ̄Y^Y^Y^Y^Y ̄
``を使えば、最小2文字の追加で呼び出すことができる
(正確にはputsしないと標準出力は表示されないからスペース入れて7文字)
Rubyでも結局同じ問題が起きる
# ruby −e Vdir=Wa bW; `ls −al #{dir}`V
ls: cannot access VaV: No such file or directory
ls: cannot access VbV: No such file or directory
(全角なのは書き込みエラーが出たから。もう面倒だから一律変換する)
回避策はいちいち言わなくていい、そんなのあるの知ってる。
Rubyでも様々な引掛けがあるという話。
2018/08/02(木) 05:32:18.98ID:5bB71pa/
Ruby使うくらいならPython使うわ。
でもここはシェルスクリプトのスレなんですよ。
しかも「ダブルクォートで囲む」という至極単純な対策でバグを回避できるんだから
他の言語を使う必要もないな。
ところでファイル名にダブルクォートが入っている場合があるので
ダブルクォートで囲む前にsed -e 's/"/\\&/g' とやる必要がある。
でもここはシェルスクリプトのスレなんですよ。
しかも「ダブルクォートで囲む」という至極単純な対策でバグを回避できるんだから
他の言語を使う必要もないな。
ところでファイル名にダブルクォートが入っている場合があるので
ダブルクォートで囲む前にsed -e 's/"/\\&/g' とやる必要がある。
2018/08/02(木) 06:11:19.56ID:tOum0Ceh
>>73
> ところでファイル名にダブルクォートが入っている場合があるので
なんのことでしょう?
ファイル名にダブルクォートが入っていても
なんの問題もないですよね?
[test.sh]
#!/bin/sh
n="a'\"b"
file "$n"
$ echo test > a\'\"b
$ ./test.sh
a'"b: ASCII text
> ところでファイル名にダブルクォートが入っている場合があるので
なんのことでしょう?
ファイル名にダブルクォートが入っていても
なんの問題もないですよね?
[test.sh]
#!/bin/sh
n="a'\"b"
file "$n"
$ echo test > a\'\"b
$ ./test.sh
a'"b: ASCII text
2018/08/02(木) 11:35:22.97ID:N9CdGDK2
bashでは0(真)か0以外(偽)となりますが、
Cスタイルのforループの条件判定のところにi==0( i>=0とするところを間違えてやってしまいました)
とやったら一回もループに入らなかったのですが、
Cスタイルのforループの中では0は偽なのでしょうか?
forループは下のループです。(chinachu-mirakurun-sleep scriptでスキップした番組の時に録画動作に入らない
ように改造したものです)
for ((i = ((${#IsSkipArray[@]} -1)) ; i>=0 ; i--)); do
if [ "${IsSkipArray[i]}" = "false" ]; then
(( RecTime = ${RecTimeMsec[i]} / 1000 ))
elif [ "${IsSkipArray[i]}" = "true" ]; then
:
fi
done
Cスタイルのforループの条件判定のところにi==0( i>=0とするところを間違えてやってしまいました)
とやったら一回もループに入らなかったのですが、
Cスタイルのforループの中では0は偽なのでしょうか?
forループは下のループです。(chinachu-mirakurun-sleep scriptでスキップした番組の時に録画動作に入らない
ように改造したものです)
for ((i = ((${#IsSkipArray[@]} -1)) ; i>=0 ; i--)); do
if [ "${IsSkipArray[i]}" = "false" ]; then
(( RecTime = ${RecTimeMsec[i]} / 1000 ))
elif [ "${IsSkipArray[i]}" = "true" ]; then
:
fi
done
2018/08/02(木) 11:45:13.93ID:N9CdGDK2
ちょっと訂正します。
間違えたコードはi==0ではなく、条件式にi=0としていました。
だから毎回判定するごとにiに0が代入されてループに入れなかったんですが、
お聞きしたかったのは0が偽だからループに入れなかったのか?ということでした。
条件式に代入式を持ってくる時点で素人丸出しなんですが、どうかご容赦ください。
間違えたコードはi==0ではなく、条件式にi=0としていました。
だから毎回判定するごとにiに0が代入されてループに入れなかったんですが、
お聞きしたかったのは0が偽だからループに入れなかったのか?ということでした。
条件式に代入式を持ってくる時点で素人丸出しなんですが、どうかご容赦ください。
2018/08/02(木) 12:23:00.77ID:N9CdGDK2
ttps://mywiki.wooledge.org/ArithmeticExpression
ここのサイトを見たらfor (( ; ; ))もArithemetic Expression(算術式)で、
However, when evaluating an arithmetic expression, C language rules (0 is false, anything else is true) apply.
と書いてありました。Cの原則が適用されるようですね。自己解決したっぽいです。
どうもお騒がせしました。
ここのサイトを見たらfor (( ; ; ))もArithemetic Expression(算術式)で、
However, when evaluating an arithmetic expression, C language rules (0 is false, anything else is true) apply.
と書いてありました。Cの原則が適用されるようですね。自己解決したっぽいです。
どうもお騒がせしました。
2018/08/03(金) 14:17:14.85ID:htH9kPBS
2018/08/03(金) 14:39:56.40ID:nG7YYTv9
そんなんsakuraだってあるぞ
2018/08/03(金) 14:58:08.23ID:htH9kPBS
>ファイル名に、ダブルクォートが入っている
ファイル名に、! が入っていたら、どうなる?
テレビ番組の録画で「何々!」「何々!!」みたいな番組名が、ファイル名になる場合
ファイル名に、! が入っていたら、どうなる?
テレビ番組の録画で「何々!」「何々!!」みたいな番組名が、ファイル名になる場合
2018/08/03(金) 15:01:48.95ID:TC+4ZTQW
>>80
感嘆符が特殊文字になるのってインタラクティブなときだけじゃね?
感嘆符が特殊文字になるのってインタラクティブなときだけじゃね?
2018/08/03(金) 17:12:49.75ID:5qGFGeHO
>>80
こういうのって何言いたいのかわからんな。「問題」でも出してるのか??
こういうのって何言いたいのかわからんな。「問題」でも出してるのか??
2018/08/03(金) 17:30:20.61ID:TDL18VXl
>>80
それこそ、自分で何とかしろって感じだな
それこそ、自分で何とかしろって感じだな
2018/08/03(金) 18:47:15.20ID:TC+4ZTQW
いやだから,感嘆符が特殊文字になるのはインタラクティブなときのみじゃないの?
2018/08/03(金) 18:49:00.35ID:BX8VumvQ
bashあんまり使わんからなあ
86デフォルトの名無しさん
2018/08/03(金) 20:02:10.32ID:X+nM2ZWl ! を特別扱いするシェルを使っているかどうかの問題ではないかな。
OSやファイルシステムが特別扱いしているってこともあり得なくもないが。
UNIX系OSだと / しか特別扱いしてないよね。
OSやファイルシステムが特別扱いしているってこともあり得なくもないが。
UNIX系OSだと / しか特別扱いしてないよね。
8780
2018/08/03(金) 20:31:20.88ID:htH9kPBS Linux 板で、テレビ番組名に、!!! みたいなものが入っていて、
それがファイル名になる場合に、バグるって言ってたから
! は、エスケープも出来ないとか
それがファイル名になる場合に、バグるって言ってたから
! は、エスケープも出来ないとか
2018/08/03(金) 20:50:55.07ID:TDL18VXl
他の環境ではNGの可能性があるということを考えると
怪しい文字は極力ファイル名に使わないようにしてる。
ある意味思考停止だけどw
CD-R焼く時、使える文字がフォーマットによりまちまちで、
ものすごい複雑だったことを思い出したわ。
ロミオとジョリエットwとか、ロックリッジとかあったなぁ。
怪しい文字は極力ファイル名に使わないようにしてる。
ある意味思考停止だけどw
CD-R焼く時、使える文字がフォーマットによりまちまちで、
ものすごい複雑だったことを思い出したわ。
ロミオとジョリエットwとか、ロックリッジとかあったなぁ。
2018/08/03(金) 20:52:13.47ID:u/asMYJG
余計な手間を省くのは正攻法だしいんじゃね
2018/08/03(金) 21:25:09.26ID:5qGFGeHO
>>87
だから、なにを言っているのかわからんてww
だから、なにを言っているのかわからんてww
2018/08/03(金) 21:36:10.72ID:8YejLfKY
2018/08/03(金) 21:38:01.51ID:5qGFGeHO
>>86
特殊文字って場合によりでしかないよな。特殊文字だから必ずバグる(?)なんてないし
シェルというか引数として受けたコマンドがって感じかなあ。bash自体がスクリプト中の引数を含めたコマンド文字列に特殊文字があっても何もしない/しないようにできるし
ID:htH9kPBSが言っているのは、ID:TC+4ZTQW が言っているコマンドラインでのヒストリ(参照)処理に引っかかる場合で、シェル「スクリプト」の問題ではないだろう
特殊文字って場合によりでしかないよな。特殊文字だから必ずバグる(?)なんてないし
シェルというか引数として受けたコマンドがって感じかなあ。bash自体がスクリプト中の引数を含めたコマンド文字列に特殊文字があっても何もしない/しないようにできるし
ID:htH9kPBSが言っているのは、ID:TC+4ZTQW が言っているコマンドラインでのヒストリ(参照)処理に引っかかる場合で、シェル「スクリプト」の問題ではないだろう
2018/08/03(金) 22:13:10.45ID:5qGFGeHO
スクリプトとして關係ないが、超シンプルにしての
$ ls '!'
ls: !: No such file or directory
まあ、そうだな
$ ls !
ls: !: No such file or directory
ほう
$ ls "!"
-bash: !: event not found
なんでやねんっ!ってとこではあるな
コマンドラインでも ! を打たなきゃファイル名がんなの入っていてもだし、! を含めたファイル名なんぞを打たなきゃでも ' でくくればいいんじゃね
$ ls '!'
ls: !: No such file or directory
まあ、そうだな
$ ls !
ls: !: No such file or directory
ほう
$ ls "!"
-bash: !: event not found
なんでやねんっ!ってとこではあるな
コマンドラインでも ! を打たなきゃファイル名がんなの入っていてもだし、! を含めたファイル名なんぞを打たなきゃでも ' でくくればいいんじゃね
2018/08/03(金) 22:47:23.99ID:TC+4ZTQW
だからすごく単純な話で
$ cat ./hstex.sh
#! /usr/bin/env bash
case $- in
(*H*)
echo enabled
;;
(*)
echo disabled
;;
esac
$ ./hstex.sh
disabled
こういうことでしょ?
つまりシェルスクリプトになってるときbashはヒストリ展開を既定で行わないから
エスケープを考える必要はないの。
$ cat ./hstex.sh
#! /usr/bin/env bash
case $- in
(*H*)
echo enabled
;;
(*)
echo disabled
;;
esac
$ ./hstex.sh
disabled
こういうことでしょ?
つまりシェルスクリプトになってるときbashはヒストリ展開を既定で行わないから
エスケープを考える必要はないの。
2018/08/03(金) 22:52:05.62ID:8YejLfKY
はぁ、シェル「スクリプト」かどうかの問題じゃないんだってば
>>93はevent not foundってでなかったんで
考えるのメンドーなんでぐぐって
https://qiita.com/Qutjl/items/6e0056853c94011d245b のネタパクるけどさ
$ ruby -e "puts 'Hello, World!'"
-bash: !': event not found
はい、たしかにそうなりますね。
テキストエディタで「puts 'Hello, World!'」という内容のcode.txtファイルを作成する
$ cat code.txt
puts 'Hello, World!'
$ a=$(cat code.txt)
$ echo "$a"
puts 'Hello, World!'
変数 a に先程の文字列を入れました
$ ruby -e "$a"
Hello, World!
はい、エラーになりません。
これはシェルスクリプトが特殊なんじゃねーよ。
C言語で、ソースコードに"\n"と書いてある文字列をprintfした時と
\nという文字列が入っている変数をprintfした時の挙動と一緒だろうが
プログラミングの基礎やで。ソースコードをパースするときの処理かどうかの違い
>>93はevent not foundってでなかったんで
考えるのメンドーなんでぐぐって
https://qiita.com/Qutjl/items/6e0056853c94011d245b のネタパクるけどさ
$ ruby -e "puts 'Hello, World!'"
-bash: !': event not found
はい、たしかにそうなりますね。
テキストエディタで「puts 'Hello, World!'」という内容のcode.txtファイルを作成する
$ cat code.txt
puts 'Hello, World!'
$ a=$(cat code.txt)
$ echo "$a"
puts 'Hello, World!'
変数 a に先程の文字列を入れました
$ ruby -e "$a"
Hello, World!
はい、エラーになりません。
これはシェルスクリプトが特殊なんじゃねーよ。
C言語で、ソースコードに"\n"と書いてある文字列をprintfした時と
\nという文字列が入っている変数をprintfした時の挙動と一緒だろうが
プログラミングの基礎やで。ソースコードをパースするときの処理かどうかの違い
2018/08/03(金) 23:09:12.00ID:5qGFGeHO
2018/08/03(金) 23:09:28.23ID:TC+4ZTQW
えぇ……
もしかして俺が間違ってるのかと不安になるほど自信満々な書き方だなw
もしかして俺が間違ってるのかと不安になるほど自信満々な書き方だなw
2018/08/03(金) 23:11:06.77ID:5qGFGeHO
2018/08/03(金) 23:14:28.27ID:5qGFGeHO
>>97
まあ...気にすんな。「ナニ」か違う(?)と思ったのだろう。よくわからんけど
まあ...気にすんな。「ナニ」か違う(?)と思ったのだろう。よくわからんけど
100デフォルトの名無しさん
2018/08/03(金) 23:28:02.17ID:h174pTLw 若者はヒストリー置換を知らないんだなあと感じいる俺はオッサン。
ヒストリー置換は対話的な入力にしか影響しないから、
スクリプトにするときは気にしなくていいよ。
ヒストリー置換は対話的な入力にしか影響しないから、
スクリプトにするときは気にしなくていいよ。
101デフォルトの名無しさん
2018/08/04(土) 02:05:18.25ID:j+kw9Zam102デフォルトの名無しさん
2018/08/04(土) 03:08:34.02ID:ddNokTrS イミフ
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市首相の発言は逆効果?「shut your mouths」は英語圏では日本語の『黙れ』と比べものにならないほど極めて侮辱的な意味がある [バイト歴50年★]
- 渡邊渚「性を売ってるくせに」批判に反論 幻滅「これが日本の現状だよなー」「『渾身の下着!』というような意味でやってない」★2 [Ailuropoda melanoleuca★]
- ひろゆき氏、日中対立に 「結局、人口というのは国力なので。10億人以上いる国に、1億2000万人で対抗可能であるというのが間違い」 [冬月記者★]
- 「おこめ券」でJAを救済したいだけ…税金4000億円で"史上最高値のコメ"を買わせる農水大臣とJAの癒着ぶり [バイト歴50年★]
- 渡邊渚さん脅迫か 写真集に包丁置く写真投稿 30代女性書類送検 渡邊さん「外に出るのも怖く身の危険を感じる」 [ひかり★]
- 【千葉】会社で58歳女性刺される 殺人未遂容疑で同僚の中国籍の男(39)逮捕 女性死亡 いすみ市 [ぐれ★]
- 今年はインデックス買ってるだけで1000万も資産が増えた、何もしてないのに !安倍晋三「おかしいよ」 [369521721]
- アメリカ「社会保障が脆弱で医療費がバカ高く家賃も高騰し、中流でも病気、怪我になればあっという間にホームレスです」👈これ [689851879]
- 【風向き】ヤバい!高市が導入を検討する「防衛特別所得税」、ネトウヨらもまさかの反対の大合唱。。さすがに国民を舐めすぎたか? [219241683]
- 俺「おにいさーん❤私と一緒に遊ばない?❤」(腰フリフリ❤)
- お茶会(ズートピアの感想)
- 【悲報】 高市が発言した「shut your mouths」英語圏でとんでもない侮辱発言だった どうすんのこれ・・・ [434776867]
