シェルスクリプト総合 その21
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
2012/11/15(木) 18:57:33.11□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その20
http://toro.2ch.net/test/read.cgi/unix/1339083351/
0499名無しさん@お腹いっぱい。
2013/04/22(月) 22:47:59.51http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
へえ、こんなのあるんだ
0500名無しさん@お腹いっぱい。
2013/04/22(月) 22:55:36.850501名無しさん@お腹いっぱい。
2013/04/22(月) 23:43:29.700502名無しさん@お腹いっぱい。
2013/04/22(月) 23:44:15.62おまえのせいでみんな迷惑してるんだけど
0503名無しさん@お腹いっぱい。
2013/04/23(火) 00:00:55.590504名無しさん@お腹いっぱい。
2013/04/23(火) 00:06:06.600505名無しさん@お腹いっぱい。
2013/04/23(火) 01:45:12.760506名無しさん@お腹いっぱい。
2013/04/23(火) 02:12:16.82そんなにみんなが使ってくれるとは思わなかったから。コマンドラインよりAPIから呼ぶのが殆どとかもあるかもだけど。
>>498
そういう解釈もあると思う。
ただドキュメント読むためだけにプログラムを実行するのもなぁ。
http://sp.e-words.jp/w/E382AAE383B3E383A9E382A4E383B3E38398E383ABE38397.html
印刷物ではなく、コンピュータ上で閲覧する 形で用意されているヘルプ文書のこと。
0507名無しさん@お腹いっぱい。
2013/04/23(火) 11:32:05.750508名無しさん@お腹いっぱい。
2013/04/23(火) 12:21:44.52他のコマンドのことを考慮はしたと思うが、後から作られるコマンドのオプションと
バッティングしないことまでは考えられなかったであろう。
私は迷惑してないですけどね。
0509名無しさん@お腹いっぱい。
2013/04/23(火) 13:15:52.18嫌だからといって、じゃぁ何に乗り換えるの?
まともにPOSIXにも準拠してない閉鎖的なOSは、コマンド体系やオプションに統一が図られてるのかな?
てか、それ以前に使えないでしょ?
0510名無しさん@お腹いっぱい。
2013/04/23(火) 13:27:09.12×使えない
○役に立たない
0511名無しさん@お腹いっぱい。
2013/04/23(火) 14:27:53.80バージョンを見ようと思って-vつけたりしたあの日
0512名無しさん@お腹いっぱい。
2013/04/23(火) 16:21:59.64ヘルプなんてのはコマンドに内蔵するべきでないと思ってたな。
プログラム動作に必要ない、人間だけのためのただの文字列で
コマンドのバイナリファイルや実行時メモリを消費するんだから。
マニュアル(man lsとか)として分離してれば
プログラム動作のみ必要な時はマニュアルをアンインストールして
HDDサイズを縮小することもできた。
0513名無しさん@お腹いっぱい。
2013/04/23(火) 16:24:56.090514名無しさん@お腹いっぱい。
2013/04/23(火) 16:30:30.620515名無しさん@お腹いっぱい。
2013/04/23(火) 16:31:20.11容量節約のためにヘルプもエラーメッセージもほとんど出ない。
たまに現地でいじる必要性が出たり、即席で診断スクリプト組んで走らせたいときに、
やっぱ不便だった。不便な理由は、使えるオプションが極端に少ないのだが、
どのオプションが使えて、どれが使えないかを調べることすら出来なかったため。
0516名無しさん@お腹いっぱい。
2013/04/23(火) 16:51:44.59技能試験の器具セットはどっちのやつがいいでしょうか。
0517516
2013/04/23(火) 16:52:17.090518名無しさん@お腹いっぱい。
2013/04/23(火) 16:53:45.87リソースフォークはいらないけどな。
そもそもUNIXは独禁法絡みで汎用コンピュータが作れないAT&Tが、
ドキュメント作成システムということで開発継続出来たのが発端。
だからオンラインドキュメントであるmanpageや
/usr/docの下のドキュメントが充実していた。
0519名無しさん@お腹いっぱい。
2013/04/23(火) 16:58:11.060520名無しさん@お腹いっぱい。
2013/04/24(水) 04:02:05.02オンラインヘルプて公式とかミラーで公開してる分じゃねーのか
0521名無しさん@お腹いっぱい。
2013/04/24(水) 05:55:35.411台のホストマシンに複数のシリアル端末からログインしてたからそれがオンラインだったということか
0522名無しさん@お腹いっぱい。
2013/04/24(水) 20:34:17.68$STRと${STR}と"${STR}"って展開され方違いますか?
echoで出して見ると同じに思えるんですが、
コマンドのパラメータにSTRを渡したときに
書き方によって正しく動くときとダメなときがあって
使い分けがさっぱりわかりません。
そもそも代入する時点で、どういうときに明示的に
ダブルクォートで括るべきなのか、サンプル見てもまちまちで
よくわかりません。
誰か、ズバッと教えてくれませんか?
0523名無しさん@お腹いっぱい。
2013/04/24(水) 20:39:15.37STR='*'
echo $STR
echo "$STR"
を試してみろ。$STR と ${STR} は同じ。
0524名無しさん@お腹いっぱい。
2013/04/24(水) 20:41:53.61結果はどうなるの?
0525名無しさん@お腹いっぱい。
2013/04/24(水) 20:43:15.39同じになるんじゃなかろうか。
nullglobがshoptされてない限り。
0526名無しさん@お腹いっぱい。
2013/04/24(水) 20:44:04.140527名無しさん@お腹いっぱい。
2013/04/24(水) 20:54:08.19その裏返しで、カレントディレクトリにファイルがある場合は違うんだから、
試してみろ、でいい。「カレントディレクトリにファイルがある場合」とか
ヒント言っちゃ駄目。本人に試させたいんだから。
>>526 馬鹿は引っ込んでろ
0528名無しさん@お腹いっぱい。
2013/04/24(水) 22:02:49.41試してみました。
実行時に変数は展開されるけど、ダブルクォートはそのまま
コマンドに渡される、ってことでしょうか?
出してくれた例だと、スクリプト実行時に
echo *
と
echo "*"
となっているってこと?
んー、スクリプト言語はよくわからん。。
0529名無しさん@お腹いっぱい。
2013/04/24(水) 22:09:30.10STR="hoge fuga"
touch $STR
ls -l
STR="hoo bar"
touch "$STR"
ls -l
0530名無しさん@お腹いっぱい。
2013/04/24(水) 22:41:49.07スペースやらワイルドカードやらチルダやらが入ってたら
展開のされ方によって動作が変わってくる可能性があるってことか。
明日出社したらスクリプト見直してみるわ。
0531名無しさん@お腹いっぱい。
2013/04/24(水) 23:44:50.780532名無しさん@お腹いっぱい。
2013/04/25(木) 06:48:29.69>スペースやらワイルドカードやらチルダやらが入ってたら
チルダは展開されない。スペースとワイルドカードの類が解釈される。
0533名無しさん@お腹いっぱい。
2013/04/26(金) 10:49:11.44"/var/www/html/logs/ sample >/dev/null 2>&1 &" >>/var/log/sample
と書くと「そのようなファイルやディレクトリはありません」と表示されます。
こういう場合はどう書けばファイル自体はありますし権限やオーナーも全て許可している状態です。
0534名無しさん@お腹いっぱい。
2013/04/26(金) 11:00:58.38どのコマンドを実行したいの。
0535名無しさん@お腹いっぱい。
2013/04/26(金) 11:11:31.71という文字列を
/var/log/sample
に追記したいだけなんですが
どこかでファイルやディレクトリとして判断されているようです。
0536名無しさん@お腹いっぱい。
2013/04/26(金) 11:24:05.04あんた、UNIXの標準入出力とリダイレクション、全然理解してないね
0537名無しさん@お腹いっぱい。
2013/04/26(金) 11:26:12.00そういったことを理解していないと質問してはいけないということですね
シェルスクリプト側で出来れば便利そうだったんですが別の方法を考えてみます。
ありがとうございました。
0538名無しさん@お腹いっぱい。
2013/04/26(金) 11:45:45.960539名無しさん@お腹いっぱい。
2013/04/26(金) 11:54:12.16echo "/var/www/html/logs/ sample >/dev/null 2>&1 &" >>/var/log/sample
0540名無しさん@お腹いっぱい。
2013/04/26(金) 12:12:44.98その出力したい文字列をコマンドとして探して、無いとエラーを出している。
リダイレクト先のファイルがない、と言っているのではなく、コマンドがない、といっている。
その文字列を出力するコマンドを、まず書かなくてはならない。例えば echo
echo "xxxxx yyy > zzz" >> sample
0541名無しさん@お腹いっぱい。
2013/04/26(金) 18:11:51.460542名無しさん@お腹いっぱい。
2013/04/26(金) 18:30:22.16>>533が&までの文字列を実行しようとしていることは分かれ。
0543名無しさん@お腹いっぱい。
2013/04/27(土) 00:38:46.41何が最適でしょうか? 今は sed '' を使ってます。
cat hoge.txt | sed ''
0544名無しさん@お腹いっぱい。
2013/04/27(土) 01:20:56.41sed に渡すってこと?
なんでもいいなら、
cat hoge.txt | cat
では?
0545名無しさん@お腹いっぱい。
2013/04/27(土) 01:31:18.66cat hoge.txt | sed
だとまずいsedってある?
0546名無しさん@お腹いっぱい。
2013/04/27(土) 01:36:03.55あ、cat でいいんですね、思いつかなかった・・・
ありがとうございました。
>>545
ほんとだ、'' は要らないですね。
0547名無しさん@お腹いっぱい。
2013/04/27(土) 10:13:59.37GNU sedは '' ないとマズ杉
0548名無しさん@お腹いっぱい。
2013/04/28(日) 00:16:28.951. コマンドを絶対パスで呼ぶ(/bin/ls とか)
2. PATHをスクリプトの冒頭で適切な値に再設定する
ですよね? でこれらに関して何ですが、とりあえず両方やった方がいいですかね?
あと、1. に関してはやはり test コマンドなんかも if /usr/bin/[ ... ] ; then ... fi って
やることになりますよね?
あと、1. で readonly LS=/bin/ls して ${LS} と呼ぶとしたら安全性は落ちますかね?
0549名無しさん@お腹いっぱい。
2013/04/28(日) 00:24:04.620550名無しさん@お腹いっぱい。
2013/04/28(日) 00:24:25.98いったいどんな環境で使ってるの?
で、そこには悪意のあるユーザーがいて、悪意のあるプログラムに ls とか名前をつけてそこら中に散りばめられてる可能性があるの?
0551名無しさん@お腹いっぱい。
2013/04/28(日) 00:44:59.500552名無しさん@お腹いっぱい。
2013/04/28(日) 02:56:32.100553名無しさん@お腹いっぱい。
2013/04/28(日) 09:03:13.99とりあえず/binや/usr/binがあるパーティションは書き込み不能。
データ用の書き込み可能なパーティションが別にあります。
基本的にはログイン不能なシステムです。がネットワークのやり取りとか
はあるので何がどうなるかは...
システムのデーモンから呼ばれるスクリプトを作ろうとしていて、
一応、パスが改ざんされる可能性を考えています。
0554名無しさん@お腹いっぱい。
2013/04/28(日) 09:10:39.10その辺真面目にやるならAppArmorとかSELinuxとかその辺使った方がいいような希ガス
0555名無しさん@お腹いっぱい。
2013/04/28(日) 09:20:46.40>何がどうなるかは… (わからない)ようなシステムかよwww
パスが改ざんされるって、「誰」のパスが改ざんされるの?
そんなことする奴がいたらそもそもパスの改ざんだけですまんだろ?
0556名無しさん@お腹いっぱい。
2013/04/28(日) 09:23:21.451.と2. 両方やった方がいい。
readonly PATH='' ってやって、PATHなしに強制する (''は書かなくても同じ意味)
これで、lsとか絶対パスでしか実行できなくなる。
testについては >>549 の指摘通り内部コマンドなので、
if [ ... ]; then って普通に書いていい。
readonly LS=/bin/ls はどっちでもいいかな。
見やすくなるかどうかくらいの意味なので。
0557名無しさん@お腹いっぱい。
2013/04/28(日) 09:30:53.19ダウト。
甘いな。
PATH='' だと、逆にカレントディレクトリ上のファイルが実行できる。
PATH=. と同じ状態。かえって危ない。
PATH=/dev/null がお勧め。
0558名無しさん@お腹いっぱい。
2013/04/28(日) 09:44:14.51PATHだけ取り上げて安全とか危ないとかwww
素直にセキュアOSの適用を考えろよ
0559名無しさん@お腹いっぱい。
2013/04/28(日) 13:50:32.70「パスが改ざんされてても正常終了します」とかゴミ仕様すぎる
0560名無しさん@お腹いっぱい。
2013/04/28(日) 15:45:42.42好きなように書けw
0561名無しさん@お腹いっぱい。
2013/04/28(日) 16:05:40.29いちゃもんつけられても困るし
0562名無しさん@お腹いっぱい。
2013/04/29(月) 02:37:46.66#! /bin/sh
run=:
msg="hanamogera"
case $1 in
--run)
run=
shift
"$@" && exit 0
if test $? -ne 0; then
run=:
echo "$msg"
fi
;;
esac
0563名無しさん@お腹いっぱい。
2013/04/29(月) 02:38:51.05bash-2.02$ ./hoge.sh --run ls -e
ls: illegal option -- e
usage: ls [-1ACFLRTWacdfikloqrstu] [file ...]
hanamogera
という実行結果なんですが、
なんで、
"$@" && exit 0
でシェルスクリプトが終了しないんですか?
0564名無しさん@お腹いっぱい。
2013/04/29(月) 06:40:13.680565名無しさん@お腹いっぱい。
2013/04/29(月) 07:19:07.54C言語と同じで、&& はショートカット動作する。
A && B
は、Aが偽だった場合、Bを実行しない。
0566名無しさん@お腹いっぱい。
2013/05/02(木) 11:31:15.220:成功
それ以外:失敗
を理解してないのかな?
&&は左辺が成功したら、右辺実行。
0567名無しさん@お腹いっぱい。
2013/05/02(木) 13:57:32.040 が 真
ということに非常に戸惑いを覚える
0568名無しさん@お腹いっぱい。
2013/05/02(木) 13:59:45.82失敗には必要だから-2,-1,1,2,3,4,...を使う。
0569名無しさん@お腹いっぱい。
2013/05/02(木) 14:09:38.88想定した結果がでたら1、じゃなければ0、想定外なら0以外
とルールを作ってスクリプトを作った。
しかし他人のコマンドを混ぜると、0が真という糞プログラムばっかりで参ってる
0570名無しさん@お腹いっぱい。
2013/05/02(木) 14:18:49.450571名無しさん@お腹いっぱい。
2013/05/02(木) 15:00:28.380572名無しさん@お腹いっぱい。
2013/05/02(木) 15:53:55.340573名無しさん@お腹いっぱい。
2013/05/02(木) 16:17:55.230574名無しさん@お腹いっぱい。
2013/05/02(木) 16:32:12.600 が真ということに戸惑うって、そりゃ当たり前だろ。一般的に真偽値の 0 は FALSE であって、
それはすなわち偽を示すものだから。
シェルスクリプトにおける 0 は「成功」なのです。あなたの中では「真 == 成功」なのですか?
0575名無しさん@お腹いっぱい。
2013/05/02(木) 17:05:11.27君の中では「偽 == 成功」なのか?
0576名無しさん@お腹いっぱい。
2013/05/02(木) 17:20:09.29シェルでは、コマンドの終了状態で判断する際に正常終了の 0 が、
論理値との対比では真に相当するのが都合がいいかな、
とボーン氏は考えたのだろう。
それ以前のシェルでも終了コードをチェックして云々はあったのかな?知らないんだけどね。
0577名無しさん@お腹いっぱい。
2013/05/02(木) 17:44:27.920578名無しさん@お腹いっぱい。
2013/05/02(木) 18:15:32.05真偽値とは別の概念として正、0、負を使い分けてる。
何の問題があるのでしょうか?
0579名無しさん@お腹いっぱい。
2013/05/02(木) 18:26:12.540580名無しさん@お腹いっぱい。
2013/05/02(木) 18:26:57.74周りもだし。郷に入っては郷に従えだろ。
0581名無しさん@お腹いっぱい。
2013/05/02(木) 18:27:40.130582名無しさん@お腹いっぱい。
2013/05/02(木) 19:53:35.550583名無しさん@お腹いっぱい。
2013/05/02(木) 20:32:25.51どっちでもないよ。「真偽」と「成功失敗」は異なる概念でしょ。
無理矢理当て嵌めようとするから、話が gdgd になってきてるんだと思う。
0584名無しさん@お腹いっぱい。
2013/05/02(木) 21:25:27.240585名無しさん@お腹いっぱい。
2013/05/02(木) 21:59:59.880586名無しさん@お腹いっぱい。
2013/05/13(月) 19:10:08.38数学的論理命題の話をしているのに、
逆が必ず真になるとの想定は如何なものか?
0587名無しさん@お腹いっぱい。
2013/05/13(月) 19:20:16.84何でも聞け。
知らないこと以外はたいてい知っている。
0588名無しさん@お腹いっぱい。
2013/05/14(火) 02:23:59.370589名無しさん@お腹いっぱい。
2013/05/14(火) 22:53:01.49シェルスクリプトでPASSを変える方法を教えてください。
0590名無しさん@お腹いっぱい。
2013/05/15(水) 11:34:22.15SET PASS=aaa
で環境変数PASSの変更が可能です
0591名無しさん@お腹いっぱい。
2013/05/15(水) 14:28:33.170592名無しさん@お腹いっぱい。
2013/05/15(水) 14:29:12.960593名無しさん@お腹いっぱい。
2013/05/17(金) 01:39:50.41readだとenterを押さないと入力された値を取得出来ません。
1.処理A
2.処理B
3.処理C
0.終了
実行する処理のキーを押してください>
上記のように画面上へ表示し、キーを押された時点で各処理実行したいのですが
シェルスクリプトで可能でしょうか?
0594名無しさん@お腹いっぱい。
2013/05/17(金) 06:26:05.73read -n 1
0595名無しさん@お腹いっぱい。
2013/05/17(金) 07:17:32.96read: 1: Illegal option -n
0596名無しさん@お腹いっぱい。
2013/05/17(金) 07:19:27.17key=`dd bs=1 count=1 2>/dev/null`
0597名無しさん@お腹いっぱい。
2013/05/17(金) 07:26:23.44stty cbreak 忘れてるぞ
事後に元に戻すのも忘れずにな。
0598名無しさん@お腹いっぱい。
2013/05/17(金) 19:43:56.07■ このスレッドは過去ログ倉庫に格納されています