シェルスクリプト総合 その22
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2013/11/01(金) 07:58:50.52□お約束
・特記なき場合は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.opensolaris.org/source/xref/onnv/onnv-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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その21
http://toro.2ch.net/test/read.cgi/unix/1352973453/
0620名無しさん@お腹いっぱい。
2014/03/28(金) 07:24:33.13> wordが空文字列なら ${parameter} と同じでは? という質問だろ
そういう疑問が出るってことは
${parameter:-word} 自体の意味をわかってないでしょ。
0621名無しさん@お腹いっぱい。
2014/03/28(金) 07:30:23.60${parameter:-word} 自体の意味をわかってるからこその疑問だろ。
man見ても set -u のことはそこには書いてないからますます疑問になるはず。
0622名無しさん@お腹いっぱい。
2014/03/28(金) 07:32:40.06ありがとうございました。変数未設定の場合の /bin/sh -u の対応ですね。
>>615 さん、それは知ってますよ。
0623名無しさん@お腹いっぱい。
2014/03/28(金) 13:44:52.410624名無しさん@お腹いっぱい。
2014/03/28(金) 14:15:56.730625名無しさん@お腹いっぱい。
2014/03/28(金) 17:27:58.23だけど、set -u してる場合はエラーを回避しちゃ
駄目なんじゃないだろうか
0626名無しさん@お腹いっぱい。
2014/03/28(金) 17:58:13.66おまえ、ホントに理解してない奴だな。
set -u はプログラムミスで変数名が違ってたりするのを防ぐのが狙い。
if [ -n "${file:-}" ]; then
なんかの場合は $file がセットされてないかどうか自体を条件判断してるんだから、
if文を実行して file: unbound variable なんてエラーメッセージ出されたら困るだろ。
0627名無しさん@お腹いっぱい。
2014/03/28(金) 18:22:18.06のが目的なんじゃないの?
0628名無しさん@お腹いっぱい。
2014/03/28(金) 19:00:02.16「検出する(そして人間が修正する)」のことを簡潔に「防ぐ」って言ってるんだろw アスぺかよw
0629名無しさん@お腹いっぱい。
2014/03/28(金) 19:11:45.22お前ホントに何もわかってないのな
プログラムミスを検知するために-uしてるのに
プログラムミスを検知しないようにしてどうする
ってことだ
0630名無しさん@お腹いっぱい。
2014/03/28(金) 19:37:00.09if [ -n "${file:-}" ]; then
の場合はそもそも set -u ではミス検出できない。
$file の状態がどちらであっても正常だから。
お前ホントに何もわかってないのな
0631名無しさん@お腹いっぱい。
2014/03/28(金) 20:14:13.71それ、全然意味が違う
0632名無しさん@お腹いっぱい。
2014/03/28(金) 20:16:29.56「set -u を使う事を前提とするなら」、 if [ -n "${file}" ]; then と書くべきなんじゃないか?って話
0633名無しさん@お腹いっぱい。
2014/03/28(金) 20:54:49.04正反対。
「set -u を使う事を前提とするなら」、 if [ -n "${file:-}" ]; then と書くべき
set -u には、${file} 以外の箇所を検出させる。 $hoge とかが他の場所にある。
0634名無しさん@お腹いっぱい。
2014/03/28(金) 20:56:38.96言葉の表面上の意味でしか捉えられないアスペ乙
0635名無しさん@お腹いっぱい。
2014/03/28(金) 21:01:24.80Makefileで、 (コマンド || true) とかやってエラーにならないようにするのと同じようなもの。
この行だけ set -u に検出されないように "${file:-}" って書くわけ。
C言語でwarning消すためにキャストするのとも似てる。
warning消しておかないと本当のwarningが出る他の行と紛らわしいから。
0636名無しさん@お腹いっぱい。
2014/03/28(金) 21:05:43.98「アスペ」の使い方間違ってるぞ
0637名無しさん@お腹いっぱい。
2014/03/28(金) 21:08:00.67う〜ん、間違えて if [ -n "${flie:-}" ]; then って書いちゃったらどうするの?
0638名無しさん@お腹いっぱい。
2014/03/28(金) 21:10:16.75そこは検出できないから仕方ない
0639名無しさん@お腹いっぱい。
2014/03/28(金) 21:11:38.06それもよく判らないなぁ。$file が未定義なのかNULLなのか判別しないまま
スクリプトの実行を続けても構わない、ってこと?
0640名無しさん@お腹いっぱい。
2014/03/28(金) 21:13:02.51∧∧
ヽ(・ω・)/ ズコー
\(.\ ノ
、ハ,,、  ̄
 ̄
0641名無しさん@お腹いっぱい。
2014/03/28(金) 21:45:19.90他の例を挙げると、引数を確認する目的で
echo "arg1=${1} arg2=${2}"
と書くのを、
set -u
echo "arg1=${1:-} arg2=${2:-}"
としないといけない、とか
0642名無しさん@お腹いっぱい。
2014/03/28(金) 22:01:46.73それだったら
file=""
:
:
if [ -n "${file}" ]; then
って書いたほうがいいんじゃない? 変数名の書き間違ちがいもチェックできるし
0643名無しさん@お腹いっぱい。
2014/03/28(金) 23:00:21.830644名無しさん@お腹いっぱい。
2014/03/29(土) 01:03:16.20いままでif連打して引数判定してたのが馬鹿馬鹿しくなってきた
三項演算子とかでググってたのがいけなかったのか
0645名無しさん@お腹いっぱい。
2014/03/29(土) 01:15:17.92どっちも正解
「set -u を使う事を前提とするなら」「空文字列判定を意図する部分では」「if [ -n "${file}" ]; then と書くべき」
「set -u を使う事を前提とするなら」「未設定の判定も意図する部分では」「if [ -n "${file:-}" ]; then と書くべき」
>>636
アスペ(もとい自閉症スペクトラム)の症状は色々な方向性がありうるから一概に間違ってるとも言えない
0646名無しさん@お腹いっぱい。
2014/03/29(土) 02:09:20.43とはいえ、>>634 は単に「アスペ」って言いたいだけなんじゃないかと
色々な方向性がありうるとなると >>634 がアスペなのかもしれないが…
0647名無しさん@お腹いっぱい。
2014/03/29(土) 06:59:56.800648名無しさん@お腹いっぱい。
2014/03/29(土) 08:35:58.71シェルスクリプトでSQLをエスケープして見せてくれよ。
0649名無しさん@お腹いっぱい。
2014/03/29(土) 08:44:55.13困っちゃう(社交辞令
0650名無しさん@お腹いっぱい。
2014/03/29(土) 09:02:19.23それを踏まえて >>625 を言っている。
どうも根本的にわかって奴が一人いるようだけど・・。
set -u は未設定(というミス)を検出するためにやっている。
その状況で、「この変数は未設定かもしれないけどエラーにならないようにしよう」とするぐらいなら
空文字列でも設定しておけ、ってこと。
0651名無しさん@お腹いっぱい。
2014/03/29(土) 09:10:53.25空文字列設定するのにもう1行要る。ダサイ書き方になる。
空文字列設定すること自体が副作用になるから、それがNGの場合がある。
未設定変数は未設定のまま(空文字列も設定せずに)放置して、ifで条件判断だけしたい場合とか。
0652名無しさん@お腹いっぱい。
2014/03/29(土) 09:13:54.84fileにすでに何か設定されてるかも知れない状態で呼び出されるスクリプトまたは関数だったら、
file='' とかやったら駄目じゃんw (ちなみに、file= だけでもOK クォート不要)
0653名無しさん@お腹いっぱい。
2014/03/29(土) 12:53:55.37一行増えるのがダサイねぇ… 副作用が NG とか if で条件判断だけしたい
場合って具体的にはどんな場合なの?
0654名無しさん@お腹いっぱい。
2014/03/29(土) 12:56:00.32>>652
0655名無しさん@お腹いっぱい。
2014/03/29(土) 13:01:32.12その前提だったら未定義かどうか調べないでいきなり if [ -n "${file:-}" ];then って
しちゃったらまずいだろって話。ああ、 >>639 に戻ったw
0656名無しさん@お腹いっぱい。
2014/03/29(土) 13:06:40.79その前提だからこそ未定義(空文字列含む)かどうか調べるために if [ -n "${file:-}" ];then って
してるんだろ。お前理解遅いなw
0657名無しさん@お腹いっぱい。
2014/03/29(土) 13:09:21.66(未定義or空文字列)なのか、文字列がセットされてるのか調べたい
変数に勝手に空文字列を代入してはいけない
調べる際に、set -u された環境でもエラーにされないようにしたい
それだけのこと。簡単だねw
0658名無しさん@お腹いっぱい。
2014/03/29(土) 13:10:26.59ん?調べてないよ。未定義でも空文字でも false になる
0659名無しさん@お腹いっぱい。
2014/03/29(土) 13:11:38.13それでいいんだけど、、何勘違いしてるの、君一人?
0660名無しさん@お腹いっぱい。
2014/03/29(土) 13:13:22.49未定義でも空文字でも false にしたい。
文字列が長さ1以上あれば true にしたい。
未定義のとき、set -u を回避したい。
0661名無しさん@お腹いっぱい。
2014/03/29(土) 13:13:44.48>>637
0662名無しさん@お腹いっぱい。
2014/03/29(土) 13:14:52.57>>638
0663名無しさん@お腹いっぱい。
2014/03/29(土) 13:15:54.57それじゃ set -u 使う意味ないんじゃない?
0664名無しさん@お腹いっぱい。
2014/03/29(土) 13:16:55.00C言語でwarning回避するためにキャストしたとき、キャスト元の方が本当に間違っていても検出できないのと同じ。そこは問題にしない。
0665名無しさん@お腹いっぱい。
2014/03/29(土) 13:17:47.16>>633
0666名無しさん@お腹いっぱい。
2014/03/29(土) 13:18:57.95いや、C言語のワーニング回避とは関係ない
0667名無しさん@お腹いっぱい。
2014/03/29(土) 13:20:06.55結局、放置しておいて問題ない、と
0668名無しさん@お腹いっぱい。
2014/03/29(土) 13:21:52.32外した回答叩かれた >>615 が一人で暴れてるのかな?
■ このスレッドは過去ログ倉庫に格納されています