トップページunix
988コメント297KB

シェルスクリプト総合 その24©5ch.net

■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net2014/11/11(火) 00:54:03.43
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その23
http://peace.2ch.net/test/read.cgi/unix/1404204950/
0590名無しさん@お腹いっぱい。2015/05/20(水) 18:24:21.97
× 答えなかった
○ 答えられなかった(コミュ能力不足)
0591名無しさん@お腹いっぱい。2015/05/20(水) 18:27:39.23
まぁある意味答えられなかったとは言えるな。
認めよう。
0592名無しさん@お腹いっぱい。2015/05/20(水) 18:33:19.73
少なくとも、ほかの人はある程度の要求仕様をくみ取るところまでは出来たわけだから、
コミュ能力であることは明白。キミさー、これじゃ仕事できないよ。
0593名無しさん@お腹いっぱい。2015/05/20(水) 18:38:02.12
そうだねバファリンの半分が優しさでできているのだとしたら、
彼等は九割方優しさで出来てるといえるね。
0594名無しさん@お腹いっぱい。2015/05/20(水) 19:11:05.53
追っ払っといた。以降スルーで。
あいつはおたくらが汚いレスする値打ちも無い。だからこそ俺の様な男がいるのさ。
0595名無しさん@お腹いっぱい。2015/05/21(木) 06:15:13.14
-gt の利点について教えてください。
[ HOGE -gt 123 ]
は、
((HOGE > 123))
とも記述できますよね? なら -gt の必要性はあるのでしょうか?
0596名無しさん@お腹いっぱい。2015/05/21(木) 10:47:36.25
>>569
一体どういう書式のどんな結果をどうやって受け取っているのか、参考までに見せて欲しい。
0597名無しさん@お腹いっぱい。2015/05/21(木) 13:10:57.30
>>595
前者はbourne shellから使える一般的な方法
後者は一部のシェルの拡張機能で、使えない場合がある。
使えるならどっちでもいい。上で出てたbusyboxのshだと使えないんじゃないかな多分
0598名無しさん@お腹いっぱい。2015/05/21(木) 15:22:40.17
>>595
数値比較だから16進や8進表現が使える
0599名無しさん@お腹いっぱい。2015/05/21(木) 16:10:57.08
>>598
-gt の利点として??
0600名無しさん@お腹いっぱい。2015/05/21(木) 16:34:31.27
利点欠点というより
数値比較と文字列比較で機能が異なるので
比べるものじゃない
0601名無しさん@お腹いっぱい。2015/05/21(木) 17:02:11.38
[ -gt ] も (( > )) も、数値としての比較だが、、
0602名無しさん@お腹いっぱい。2015/05/21(木) 17:12:42.96
ごめ、誤解してたわ
0603名無しさん@お腹いっぱい。2015/05/21(木) 22:58:30.82
>>596
いくら?
0604名無しさん@お腹いっぱい。2015/05/22(金) 10:22:56.55
まず自分なりに作ったサンプル出してからうまくいかないと相談すればいいのに
はなから見せろとか無いわ〜
0605名無しさん@お腹いっぱい。2015/05/22(金) 11:00:25.39
#/bin/sh
curl

ほい
0606名無しさん@お腹いっぱい。2015/05/22(金) 11:11:39.20
すみませんが詳しい方のみ回答をお願いします
0607名無しさん@お腹いっぱい。2015/05/22(金) 11:19:33.89
>>605
ドキュメント読んで出直してこい
0608名無しさん@お腹いっぱい。2015/05/22(金) 11:36:29.05
やだね

(echo USER hoge; echo PASS pass; echo STAT) | nc server 110
0609名無しさん@お腹いっぱい。2015/05/22(金) 11:38:38.49
>>605
そこまでして欲しいのかwww
頭が無いなら金を払えよ
0610名無しさん@お腹いっぱい。2015/05/22(金) 11:41:25.48
>>609
>>606
0611名無しさん@お腹いっぱい。2015/05/22(金) 11:52:29.57
DOC嫁なんて言う奴に限って自分は読んでいないのもよくある話。
0612名無しさん@お腹いっぱい。2015/05/22(金) 12:14:11.32
読むのは質問者で回答者じゃない
0613名無しさん@お腹いっぱい。2015/05/22(金) 12:15:28.97
>>612
>>606
0614名無しさん@お腹いっぱい。2015/05/23(土) 00:45:24.32
>>606
そら違うだろ
回答してくれる気のある方のみレスしてくださいだろ
0615名無しさん@お腹いっぱい。2015/05/23(土) 07:23:22.41
コピペ荒らしにマジレスしてもねぇ
0616名無しさん@お腹いっぱい。2015/05/23(土) 07:57:47.77
利点とかより互換性だけじゃね?
0617名無しさん@お腹いっぱい。2015/05/23(土) 09:04:23.16
>>614
自分では回答しているつもりになっている半可通が居るからじゃないの?
>>525とかは回答なんだろうけど、回答者からは質問者だと錯覚されるから回答がこなくなる。
0618名無しさん@お腹いっぱい。2015/05/23(土) 09:53:03.52
100レス近く前の書き込みを引っ張る質問者も
相当な意気込みで実装したいらしいな
いじってやるからまた書き込みなよ
0619名無しさん@お腹いっぱい。2015/05/23(土) 11:20:44.87
ほら居るし。
0620名無しさん@お腹いっぱい。2015/05/23(土) 11:26:14.78
これだけの時間があればCででも実装できたろうにw
0621名無しさん@お腹いっぱい。2015/05/23(土) 11:31:28.73
教えてやるから結果を見せろというべきだな。
それが正当な対価だろう。
0622名無しさん@お腹いっぱい。2015/05/23(土) 12:58:15.22
他人の結果に興味はないだろ普通。
「できましたー!!」←これが対価なの?
馬鹿にしてるの?
0623名無しさん@お腹いっぱい。2015/05/23(土) 14:47:50.85
興味がないのに口出す訳ないだろう。
0624名無しさん@お腹いっぱい。2015/05/23(土) 14:55:03.12
>>606ですが、ロム容量が極小の組み込み機器に入れる予定で、
シェルスクリプトじゃないとダメです。
繰り返しますがわかる方のみ回答してください。

わからない方は技術力がないと同一ですので(認めたくないでしょうけど)、
素直に黙るのが賢明です。
0625名無しさん@お腹いっぱい。2015/05/23(土) 15:29:15.99
>>624
極小ならアセンブラだろ
0626名無しさん@お腹いっぱい。2015/05/23(土) 15:32:43.77
偽者の>>624は消えろ
まあこれぶっちゃけ200万レベルの仕事だね
0627名無しさん@お腹いっぱい。2015/05/23(土) 15:50:06.27
アセンブラでも構いません。ARMでお願いします。
繰り返しますがわかる方のみ回答してください。
0628名無しさん@お腹いっぱい。2015/05/23(土) 15:58:55.20
>>626
シェルスクリプトで暗号通貨のウォレットでも作れば?
0629名無しさん@お腹いっぱい。2015/05/23(土) 16:04:25.94
それはもうできています。
すみませんが質問にだけ回答してください。
0630名無しさん@お腹いっぱい。2015/05/23(土) 16:39:09.77
できてるならみせてよ
0631名無しさん@お腹いっぱい。2015/05/23(土) 16:52:36.76
繰り返しますがわかる方のみ、質問にだけ回答してください。
0632名無しさん@お腹いっぱい。2015/05/23(土) 17:05:15.19
>>631
回答者以外はご遠慮下さい。
0633名無しさん@お腹いっぱい。2015/05/23(土) 17:07:20.51
こっちは仕事でやってるんです。
趣味で遊んでるアナタ方とは違うんです。
0634名無しさん@お腹いっぱい。2015/05/23(土) 17:09:47.01
そういうネタをやられては困ります。
0635名無しさん@お腹いっぱい。2015/05/23(土) 17:43:32.85
仕事でやってるのにまさかただとは...
0636名無しさん@お腹いっぱい。2015/05/23(土) 17:56:45.03
仕事とかいうネタはやめましょうねボク。
0637名無しさん@お腹いっぱい。2015/05/23(土) 18:22:50.65
仕事=質量×距離
0638名無しさん@お腹いっぱい。2015/05/23(土) 18:27:23.08
>>637
仕事=力×距離

ネタぐらい正しく書こうね
0639名無しさん@お腹いっぱい。2015/05/23(土) 18:57:31.97
>>638
仕事=速度²×質量
だろ
0640名無しさん@お腹いっぱい。2015/05/23(土) 19:02:04.07
電子工学系の者にとっては

仕事=電圧×電流×時間
0641名無しさん@お腹いっぱい。2015/05/24(日) 08:36:07.43
仕事=電界×磁界×断面積×時間
0642名無しさん@お腹いっぱい。2015/05/24(日) 09:10:55.86
金=仕事x時間
0643名無しさん@お腹いっぱい。2015/05/24(日) 09:16:37.72
∂金/∂t = ∇×仕事
0644名無しさん@お腹いっぱい。2015/05/24(日) 09:43:16.72
∇・金=0 (金は湧いてこない)
0645名無しさん@お腹いっぱい。2015/05/24(日) 11:40:16.08
>>637-645
もういいんじゃない?
0646名無しさん@お腹いっぱい。2015/05/24(日) 11:47:41.07
仕事×2ch=解雇
0647名無しさん@お腹いっぱい。2015/05/24(日) 13:06:10.39
シェルスクリプトで計算式記述してみてよ
0648名無しさん@お腹いっぱい。2015/05/24(日) 13:18:01.71
物理量の仕事じゃなくて、こっちは本当の仕事でやってるんです。
趣味で遊んでるアナタ方とは違うんです。
0649名無しさん@お腹いっぱい。2015/05/24(日) 13:29:57.13
まあどうみても>>624は趣味だけどな。
0650名無しさん@お腹いっぱい。2015/05/24(日) 18:19:02.96
まちがって、

cd //

ってやったら、エラーにならずに、pwdが//になったw
どこにいたんだ?ww
0651名無しさん@お腹いっぱい。2015/05/24(日) 18:24:05.92
ネットワークのトップか
そんなとこにも移動できるのか
0652名無しさん@お腹いっぱい。2015/05/24(日) 18:58:32.27
>>650
bashの仕様です。今ごろ気が付いたの?
0653名無しさん@お腹いっぱい。2015/05/24(日) 21:43:39.35
知らなかった
0654名無しさん@お腹いっぱい。2015/05/25(月) 12:23:11.70
> bashの仕様す。
というよりは、POSIX かな

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html

3.267 Pathname
Multiple successive <slash> characters are considered to be the same as one <slash>,
except for the case of exactly two leading <slash> characters.

4.12 Pathname Resolution
If a pathname begins with two successive <slash> characters, the first component following
the leading <slash> characters may be interpreted in an implementation-defined manner,
although more than two leading <slash> characters shall be treated as a single <slash>
character.
0655名無しさん@お腹いっぱい。2015/05/25(月) 12:36:39.43
英語よめんけどなんか違う
0656名無しさん@お腹いっぱい。2015/05/25(月) 14:37:48.45
知識無いのに 「bashの仕様です。今ごろ気が付いたの?」 とか恥ずかしくないのだろうか
0657名無しさん@お腹いっぱい。2015/05/25(月) 16:59:21.87
script書いたらすぐ行き当たる問題だし、
pwdで//が二つ出るのはbashやdashの仕様だよ。
zsh rc tclsh tcshどれも/だよ。
0658名無しさん@お腹いっぱい。2015/05/25(月) 19:39:52.69
>>656の人生に暗黒の1ページが加えられた瞬間に立ちあえたことに感謝w
0659名無しさん@お腹いっぱい。2015/05/25(月) 20:31:48.30
ご質問です。
コマンドライン引数の数字を順番に四則演算するシェルプログラミングを
作りたいのですが、うまくいきません。
演算の順番は+(加算)−(減算)*(乗算)/(除算)です。

#!/bin/sh

total=0
a=("$@")
n=${#a[@]}
n=$((n - 1))
while [ $n -ge 0];
do
total=$((a[$n] + $total))
n=$((n-1))
done
echo "total = $total"

自分でできたのはコマンド引数を加算のみ繰り返す処理です。
もしよい解決方法がおありでしたらご教授お願いします。
0660名無しさん@お腹いっぱい。2015/05/25(月) 21:12:27.93
学校の宿題か?だったら自分でやれ
06616592015/05/25(月) 21:36:30.45
シェルプログラミングの教本で学び始めた、IT土方目指してるニートです。
教本に応えが載ってなくて、序盤のページで行き詰ってしまいました。
0662名無しさん@お腹いっぱい。2015/05/25(月) 21:46:27.07
# こんな感じで動くけどzshじゃないと動かない。後は直してね。
total=0
r=0
until test $#@ -eq 0
do
case $(( r % 4 == 0 ? 1 : (r + 3) % 4 == 0 ? 2 : (r + 2) % 2 == 0 ? 3 : 4 )) in
1) total=$(( total + $1 ));;
2) total=$(( total - $1 ));;
3) total=$(( total * $1 ));;
4) total=$(( total / $1 ));;
esac
shift
(( ++r ))
done
0663名無しさん@お腹いっぱい。2015/05/25(月) 21:53:31.12
# bashで動いた。そっかzshでも$#だけでいいのか。
r=0
until test $# -eq 0
do
case $(( r % 4 == 0 ? 1 : (r + 3) % 4 == 0 ? 2 : (r + 2) % 2 == 0 ? 3 : 4 )) in
1) total=$(( total + $1 ));;
2) total=$(( total - $1 ));;
3) total=$(( total * $1 ));;
4) total=$(( total / $1 ));;
esac
shift
(( ++r ))
done
0664名無しさん@お腹いっぱい。2015/05/25(月) 21:55:32.99
他にもzshだと
for a b c in 1 2 3
do
echo $a $b $c
done
みたいな処理もできる。
0665名無しさん@お腹いっぱい。2015/05/25(月) 22:08:26.16
最初のr=0も無くて動くか。
0666名無しさん@お腹いっぱい。2015/05/25(月) 22:21:07.68
ifとelseでも書けるよ。
baseの後に何が書いてあるのか分らない時は
三項演算子というのを調べると良い。
0667名無しさん@お腹いっぱい。2015/05/25(月) 22:21:52.93
baseじゃなくてcaseね。
0668名無しさん@お腹いっぱい。2015/05/25(月) 22:37:26.67
total=$(echo "$1+$2-$3*$4/$5" | bc)
echo "total = $total"
0669名無しさん@お腹いっぱい。2015/05/25(月) 23:22:22.44
自分の行為に「ご」をつけるとか、
どれだけ偉いんだって話だよな。
0670名無しさん@お腹いっぱい。2015/05/26(火) 01:08:45.37
busyboxだとbcよりdcの方が都合がいいのだろうか?
まあawkでいいような気もするけど。
06716592015/05/26(火) 06:28:38.16
遅くなりましたが、複数の例を挙げてもらって大変勉強になりました!!三項演算子を使う発想はなかった…
0672名無しさん@お腹いっぱい。2015/05/26(火) 14:02:41.07
お世話になります。
PROMPT_COMMANDの設定について教えて下さい。

ターミナルのタイトルバーに現在のディレクトリ名"だけ"を表示したいのですが、
プロンプトの設定でやる
PS1=\w
のような \w がPROMPT_COMMANDの設定では使えないんですね?

どうやったらいいのでしょうか?
0673名無しさん@お腹いっぱい。2015/05/26(火) 15:34:18.87
PROMPT_COMMAND="pwd"はできるから好きにやればいい
0674名無しさん@お腹いっぱい。2015/05/26(火) 15:43:42.53
PROMPT_COMMAND='RSET=$(tput sgr0); B=$(tput setf 1); echo "$USER ${B}${PWD}${RSET} $"'
0675名無しさん@お腹いっぱい。2015/05/26(火) 15:53:38.10
ターミナルでしたか。勘違いしていた
PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
PROMPT_COMMAND='echo -ne "\033]0;${PWD/$HOME/~}\007"'
0676名無しさん@お腹いっぱい。2015/05/26(火) 20:32:22.47
>>671
ごめん。三項演算子に間違いがあった。
(r + 2) % 2 == 0 ? 3 : 4 )) in じゃなくて
(r + 2) % 4 == 0 ? 3 : 4 )) in だった。
以下楽しくなって、もう一つ書いといた。zshでしか動かないけれど。

a=(+ - \* /)
b ()
{
(( $# == 1 )) || b $@[1,-2]
total=$(( total $a[$(( ($# + 3) % 4 == 0 ? 1 : ($# + 2) % 4 == 0 ? 2 : ($# + 1) % 4 == 0 ? 3 : 4 ))] $@[-1] ))
echo $total
}
b $@


じゃあ勉強頑張って。
06776592015/05/26(火) 21:00:09.14
なぜか2で割ってるのはif文でつくり直してるときに気付きました!!
sh、zsh、bashの違いが何やら…
0678名無しさん@お腹いっぱい。2015/05/26(火) 22:22:51.71
>>677
そんなあなたにbusybox
0679名無しさん@お腹いっぱい。2015/05/27(水) 08:32:10.49
bashもzshも、shの機能を包括した上で拡張していて、shの構文なら共通して動くと捉えてれば良い
と思う。だからbashとzshは配列の扱いなど雑多な違いがある。以下昨日のbash版。
たぶんもっと簡素に書けるのだろうけど私も全然詳しくない。

a=(+ - \* /)
b ()
{
declare -a c=( $@ )
(( $# == 1 )) || b $( echo ${c[@]} |cut -d ' ' -f -$(( $# - 1 )) )
total=$(( total ${a[$(( ($# + 3) % 4 == 0 ? 0 : ($# + 2) % 4 == 0 ? 1 : ($# + 1) % 4 == 0 ? 2 : 3 ))]} ${c[$# - 1]} ))
echo $total
}
b $@


以下みたいな書き方も簡易な条件文。何が起こるのかは(( 1 ))した後にecho $?とかして
値を確認できる。c言語は0が偽だけどshellだと0が真なので注意。cでreturnで0返すでしょ。
さらに(( 0 ))などは、echo $?した時に0として返っていない事に注目。
(( 1 )) && echo true
(( 0 )) || echo true
自ら自らを呼ぶ、再帰関数は調べればすぐ出てくる。
declareは、再帰関数ゆえ、変数名が同じになってしまうから、関数を呼んだ側の変数の値を、
呼ばれた側が変える事が無いようにしている。ローカル変数とか、スコープとか調べると出てくる。
0680名無しさん@お腹いっぱい。2015/05/27(水) 10:46:37.27
シェルスクリプトに関するご質問です。

コマンドライン引数で指定されたキーワードに一致する部分を持つ、カレントディレクトリ配下のファイルをそのディレクトリ階層をそのままにコピーしたいのですが、何かよい方法はありますでしょうか。
何かよい方法はありますでしょうか。
実行環境はCentOSをTera Term とSSH接続している状態です。

実行例として
[user@portal ~]$ ./sample.sh A copyTo 
第1引数はキーワード、第2引数はコピー先のディレクトリ


これでコピーができたことをTera Term上で確認できることが望ましいです。
0681名無しさん@お腹いっぱい。2015/05/27(水) 11:05:38.31
ワイルドカード
0682名無しさん@お腹いっぱい。2015/05/27(水) 13:08:06.76
>>680
#!/bin/sh
find . -name "*$1*" | cpio -oc | (cd "$2" && cpio -ivdc)
0683名無しさん@お腹いっぱい。2015/05/27(水) 13:41:16.73
ワイルドカード使って自分で書いてみたらこんなのに…
#!/bin/sh
cp -Rv ["$1"] "$2"

>>682はビット演算子使っててよくわからないですが、目的の動作は確認致しました!
ありがとうございます!
0684名無しさん@お腹いっぱい。2015/05/27(水) 16:04:06.52
わざとトンチンカンなこと言ってんのかな
0685名無しさん@お腹いっぱい。2015/05/28(木) 10:32:09.00
>>663のやつ整数しか計算できないし、第1引数を0に足してるで
第1 + 第2 - 第3 * 第4 / 第5 + 第6 - …
って処理が正しい
0686名無しさん@お腹いっぱい。2015/05/28(木) 12:07:05.77
# こうすると動くよ。後は引数を実数にしてね。
total=$1; shift
a=(+ - \* /)
b ()
{
(( $# == 1 )) || b $@[1,-2]
total=$(( total $a[$(( ($# + 3) % 4 == 0 ? 1 : ($# + 2) % 4 == 0 ? 2 : ($# + 1) % 4 == 0 ? 3 : 4 ))] $@[-1] ))
echo $total
}
b $@
0687名無しさん@お腹いっぱい。2015/05/28(木) 12:23:47.19
そっか、%つかってるんだった。
まぁ本人じゃないだろうし引かせてもらおう。
0688名無しさん@お腹いっぱい。2015/05/28(木) 12:25:16.28
おそらく663のcodeに
total=$1; shift
だけでいいんじゃないかな。急ぎなので、確認して無いけど。
0689名無しさん@お腹いっぱい。2015/05/28(木) 12:32:06.05
いや%と関係ないか。$#にたいしてだったね。
■ このスレッドは過去ログ倉庫に格納されています