シェルスクリプト総合 その25©5ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。 転載ダメ©2ch.net
2015/08/14(金) 23:42:01.51□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
前スレ
シェルスクリプト総合 その24
http://peace.2ch.net/test/read.cgi/unix/1415634843/
0698名無しさん@お腹いっぱい。
2016/07/05(火) 14:27:46.64日本語ファイル名だとLinuxマシンとまともに連携が取れない。
0699名無しさん@お腹いっぱい。
2016/07/05(火) 15:14:05.40お前はまとめ見て引用しか出来ない馬鹿だな
そのリンク先にも書いてあるだろ
Unicodeのイメージ(字形)が間違ってたんだよ
XPはその仕様を忠実に実装しただけであって
アポは無視したんだよ
MSもヴィスタから同じ対応をしただけだ
知ったかぶりするんじゃねーよ
0700名無しさん@お腹いっぱい。
2016/07/06(水) 12:51:14.80Unixの読み方はユニ(ッ)クスだぞ。Linuxの読み方はリナ(ッ)クスだぞ。
ちなみにASUSはエイサスな、日本語よみでユニックスとかリナックスとかアスースとか読むのは知能が低い証拠だぞ。
Xの前は何でも「ッ」をつければいいと思ってるのは、典型的な日本人のレベルだぞ!
ちなみに、Xの前に正々堂々と「ッ」をつけてもいいのは、貴様らにほとんど関係ない
セ○クス(S○X)だけだぞ!
0701名無しさん@お腹いっぱい。
2016/07/06(水) 17:47:32.090702名無しさん@お腹いっぱい。
2016/07/06(水) 19:07:35.870703名無しさん@お腹いっぱい。
2016/07/06(水) 20:49:19.530704名無しさん@お腹いっぱい。
2016/07/06(水) 21:36:34.09方言によって訛りもあるし正直通じればなんでもいい
0705名無しさん@お腹いっぱい。
2016/07/07(木) 18:04:30.740706名無しさん@お腹いっぱい。
2016/07/12(火) 21:25:52.980707名無しさん@お腹いっぱい。
2016/07/12(火) 23:15:08.760708名無しさん@お腹いっぱい。
2016/07/14(木) 00:29:39.150709名無しさん@お腹いっぱい。
2016/07/19(火) 06:19:56.96alias command='echo "hage"'
commandにスペースを含ませる事できないのでしょうか?
0710名無しさん@お腹いっぱい。
2016/07/19(火) 08:59:57.76bashだよね。普通にできる
0711名無しさん@お腹いっぱい。
2016/07/19(火) 09:07:33.10bashの識別子の条件に反するので不可
0712名無しさん@お腹いっぱい。
2016/07/19(火) 19:42:55.37710=711 と仮定して質問するけど、710はどういう場合? 何を勘違いしたかが気になって。
0713名無しさん@お腹いっぱい。
2016/07/19(火) 21:28:50.34710=711だけど、aliasで別名を定義するコマンド(つまりイコールの右側)に
スペースを入れられるのかという質問だと考えた。例示がそういう形になってるから。
もし、alias名にスペースを入れられるかという質問ならそういう例示をするはず
でも後者の質問という可能性に気づいたので、711を追加した
0714名無しさん@お腹いっぱい。
2016/07/22(金) 22:58:42.81http://d.hatena.ne.jp/n9d/20090117/1232182669
ほとんどなんもしてないワンライナーだけど、見事にスクリプト
ファイル整形してくれる。なんか感動すたw
0715名無しさん@お腹いっぱい。
2016/08/06(土) 14:00:53.40URLからファイル名だけを抜き出すこれより冴えたやり方ってある?
ちなみにWindows10のISOはISOファイルの後ろに
セッションIDかなにかがクエリで付くんだな
cat download.txt | grep -v ^$ | grep -v ^# | while read url
do
file=`echo "$url" | sed "s/.*\///g" | sed "s/\?.*//g"`
if [ $file == "" ]
then
echo file is null "$url"
continue
fi
ps -ef | grep wget | grep "$file"
if [ $? -eq 0 ]
then
echo download now "$file"
else
wget -c -t 1000 -O "work/$file" "$url"
fi
done
一応、ファイル名を正しく取得するのと
重複ダウンロード防止機能付き
wget -cにしたのは中断後の再開がもったいないし
wget -cで2重起動するとファイルが壊れて
いやな思いをした経験があるのでチェック入れてます
0716名無しさん@お腹いっぱい。
2016/08/07(日) 00:22:16.730717名無しさん@お腹いっぱい。
2016/08/07(日) 11:38:22.64実際引っかかることはなさそうだけど
0718名無しさん@お腹いっぱい。
2016/08/08(月) 22:34:42.13testvar=aaa"aa"
${testvar##\"}
これじゃ駄目だった
0719名無しさん@お腹いっぱい。
2016/08/08(月) 23:41:17.18## は前方最長一致
全部置換するのは //
testvar='aaa"aa"'
echo ${testvar//\"}
Bashマニュアル「パラメータの展開」セクション内「パターンの置換」
http://linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBB
0720名無しさん@お腹いっぱい。
2016/08/10(水) 12:59:48.570721名無しさん@お腹いっぱい。
2016/08/11(木) 00:06:31.61はい
https://wiki.ubuntu.com/DashAsBinSh#select
https://github.com/koalaman/shellcheck/wiki/SC2039#select-loops
0722名無しさん@お腹いっぱい。
2016/08/16(火) 04:34:02.37find xargs grep?これの行数でも数えてtestに渡す?
0723名無しさん@お腹いっぱい。
2016/08/16(火) 08:28:28.59最終的にどうしたいの?
0724名無しさん@お腹いっぱい。
2016/08/16(火) 11:19:32.810725名無しさん@お腹いっぱい。
2016/08/16(火) 12:55:22.820726名無しさん@お腹いっぱい。
2016/08/16(火) 13:02:40.670727名無しさん@お腹いっぱい。
2016/08/20(土) 19:23:45.230728名無しさん@お腹いっぱい。
2016/08/21(日) 09:28:24.43とても斬新
0729名無しさん@お腹いっぱい。
2016/08/23(火) 01:57:32.120730名無しさん@お腹いっぱい。
2016/08/23(火) 02:07:00.600731名無しさん@お腹いっぱい。
2016/08/23(火) 02:08:14.36freebsd-update install
ができない
0732名無しさん@お腹いっぱい。
2016/08/23(火) 02:08:58.400733名無しさん@お腹いっぱい。
2016/08/28(日) 20:54:56.49while抜けたときに変数の内容が保持されないんだけど
元のシェルスクリプトと別プロセスになってるからってことなのかな?
以下サンプル
user01@server01 ~/test $ cat t4.sh
cat work/uhl.txt | grep -v ^# | sort | uniq | while read title
do
grepvlist=`echo "$grepvlistw | grep -v \"$title\" "`
grepvlistw=$grepvlist
echo $grepvlist
done
echo "---------"
echo $grepvlist
echo $grepvlistw
echo "---------"
user01@server01 ~/test $ sh t4.sh
| grep -v "111"
| grep -v "111" | grep -v "222"
| grep -v "111" | grep -v "222" | grep -v "333"
| grep -v "111" | grep -v "222" | grep -v "333" | grep -v "444"
---------
---------
user01@server01 ~/test $ cat work/uhl.txt
111
222
333
444
user01@server01 ~/test $
0734名無しさん@お腹いっぱい。
2016/08/28(日) 21:02:27.99$(grep -v ^# <file| sort | uniq)
EOT
0735名無しさん@お腹いっぱい。
2016/08/28(日) 21:03:00.60疑問の本質ではないのでとりあえずスルーでお願いします
0736名無しさん@お腹いっぱい。
2016/08/29(月) 03:11:36.410737名無しさん@お腹いっぱい。
2016/08/29(月) 06:36:10.220738名無しさん@お腹いっぱい。
2016/08/29(月) 12:49:07.23パイプでつなげたwhileはサブシェルで起動するから、
> while抜けたときに変数の内容が保持されないんだけど
> 元のシェルスクリプトと別プロセスになってるからってことなのかな?
ってことになる
whileをパイプの先に置いてる限り解決しないので、>>734が本質的な解
あるいは、shじゃなくてbashとかならプロセス置換が定石
while read title; do
...
done < <(cat work/uhl.txt | grep -v ^# | sort | uniq)
0739名無しさん@お腹いっぱい。
2016/09/08(木) 21:25:56.17どなたか、どうすればいいか教えてください。
お願いします。
x="http://x"
echo $x | grep -Ee "/[\w\.]"
echo $x | grep -Ee "\/[\w\.]"
echo $x | grep -Ee '/[\w\.]'
echo $x | grep -Ee '\/[\w\.]'
echo $x | grep -e "/[\w\.]"
echo $x | grep -e "\/[\w\.]"
echo $x | grep -e '/[\w\.]'
echo $x | grep -e '\/[\w\.]'
0740名無しさん@お腹いっぱい。
2016/09/09(金) 00:28:23.040741名無しさん@お腹いっぱい。
2016/09/09(金) 13:26:15.96ヘルプミー。
だろ。
grepに/が先頭に来るパターンを使った取得は俺も出来ない。
0742名無しさん@お腹いっぱい。
2016/09/09(金) 13:46:05.11期待する出力は?
0743名無しさん@お腹いっぱい。
2016/09/09(金) 14:07:32.50おまえの言うことも分からないから739と741は同一人物っぽいな
$xがURLそのものなら加工する必要が無い
0744名無しさん@お腹いっぱい。
2016/09/09(金) 15:51:28.22URL(URI)の中からホスト名(サーバー名 *1)を抽出したいなら
*1 スキーム(http:)とパス(/yyy/zzz/index.html)に挟まれた部分
[入力]URL http://www.xxx.co.jp/yyy/zzz/index.html
[出力]ホスト名 www.xxx.co.jp
$ echo "http://www.xxx.co.jp/yyy/zzz/index.html" | sed -e 's/.*http:\/\/\([^\/]*\)\/.*/\1/i'
www.xxx.co.jp
0745744
2016/09/09(金) 16:31:07.62これ2chの仕様?
もし試すなら「index.html"」の後ろの「; セミコロン」は削除して試してくれ
0746名無しさん@お腹いっぱい。
2016/09/09(金) 16:39:00.12あんたのブラウザの問題だろ
0747名無しさん@お腹いっぱい。
2016/09/09(金) 16:57:52.70741です。
妄想、乙。そのするどい頭脳でサクッとコマンド貼ってみてくださいね。
ちなみに、\wにこだわらなければ
echo $x | grep -e "/[a-zA-Z0-9\.]"
で、できる。
\wがあると、どうしてだめかはしらない。
>>744
セミコロンないよ。
0748名無しさん@お腹いっぱい。
2016/09/09(金) 17:27:46.43echo 'http://x' | grep :// で良い気がする
0749名無しさん@お腹いっぱい。
2016/09/09(金) 18:44:47.372chの仕様っていうか read.cgi のバグ
>>747
> \wがあると、どうしてだめかはしらない。
grep や egrep の正規表現では文字クラス […] 内のバックスラッシュ \ が特別な意味を持たないから
[\w] は \ と w にマッチする
[\.] は \ と . にマッチする
0750名無しさん@お腹いっぱい。
2016/09/09(金) 22:23:01.76>>741とやってることが矛盾してるが
0751名無しさん@お腹いっぱい。
2016/09/09(金) 23:05:57.440752739
2016/09/10(土) 17:00:28.25やりたかったのは、テキスト中のurlの抽出です。
urlには/が入っていて、ドメイン名にはアルファベット、数字、ピリオドがあるので、
いろいろ試しているなかで、上のようなコマンドでgrepが機能しない?と思い込んだ状態に遭遇した所でした。
https+://をgrepから外したのは、ttp://やドメイン名から始まるurl対策のつもりでした。
自分の間違いを>>749の解説と>>747のイグザンプルで理解できました。
みなさん、ありがとうございました。
本来の目的はまだ試行錯誤中ですが。
0753739
2016/09/10(土) 17:16:44.650754名無しさん@お腹いっぱい。
2016/09/14(水) 14:31:43.86time for i in $( seq -w 1 1000 ) ; do x="abcdefgh" ; y=$( echo ${x} | sed -Ee s'/b.*//g' ) ; done
time for i in $( seq -w 1 1000 ) ; do x="abcdefgh" ; y=$( sed -Ee s'/b.*//g' <<< ${x} ) ; done
を試したら、<<<の方が1割ほど遅かった。環境:macosx1095+sandy
みんなはどう?
0755名無しさん@お腹いっぱい。
2016/09/14(水) 20:50:13.24time を bash 添付の物ではなく、/usr/bin/time -v /bin/bash -c '...' で計測して詳細をみると、
前者は File system outputs: の値が 0 に対して、後者は 8000 (for の繰り返し1回あたり 8 増える)
となりました。
strace で見る限りどこかに書き込んでいるようには見えないですが、内部での実装に違いが
あるようですね。
0756名無しさん@お腹いっぱい。
2016/09/15(木) 09:05:23.94<<<だど読み込むときにstdinを準備
じゃないのか?
0757名無しさん@お腹いっぱい。
2016/09/15(木) 11:53:03.00ってことは、fstat(0, ...)で調べりゃ、レギュラーファイルになってる筈
> <<<を使うとechoで変数を渡すより速いというのを見かけて
と言うデマの火元はどこ?
0758名無しさん@お腹いっぱい。
2016/09/15(木) 13:09:35.23シングルコア/シングルプロセッサだと確実にヒアストリングの後者の方が速い
0759名無しさん@お腹いっぱい。
2016/09/15(木) 19:15:16.79解説d
ヒアストリングという言葉自体初めて知りました。
<<はヒアドキュメントということも知らずに使っていました。
環境によっては、<<<は速くなるんですね。
いい勉強になりました。
0760名無しさん@お腹いっぱい。
2016/09/24(土) 18:27:52.80Macのファイルシステムって、ファイル名を UTF-8 で保存してるかと思いきや
独自の正規化がされてまして (UTF8-MAC) 例えば、
find . -name "*ドイツ*"
とかやってもあるはずのファイルが出てこないわけです。(内部的に ド の字を ト+[濁点] みたいな格納をしてるせいです)
そこで .bash_profile に以下のように コマンドもどきの find2 を定義してやります。これで万事解決です。
# find に渡す引数を全て UTF8-MAC に変換してしてます
find2(){
eval "find "$(echo "$@" | iconv -f UTF-8 -t UTF8-MAC)
}
0761名無しさん@お腹いっぱい。
2016/09/24(土) 18:38:10.62他文字コードにも応用できそうだね
0762名無しさん@お腹いっぱい。
2016/09/24(土) 18:47:05.28-execで他のプログラムに渡すUTF-8をUTF8-MACに変換されていやーんになる
汎用的にするなら要ブラッシュアップ
0763名無しさん@お腹いっぱい。
2016/09/24(土) 21:51:49.29ただ -exec の方は 問題は別にあって
終端を表す \; の \(バックスラッシュ)
が消えちゃうんですね。そもそもiconv変換する前の時点で。
一応対応できたと思うんですが、
長くなったので貼るのはやめときます。
0764名無しさん@お腹いっぱい。
2016/09/24(土) 22:10:40.49;じゃないと困るのはかなり特殊なケース
0765名無しさん@お腹いっぱい。
2016/09/24(土) 22:13:36.64どっかで読んだ内容だなぁと思ったら、これ↓のパクリか!
「新・OS X ハッキング! (169) Terminal上で「ダ」や「パ」が付くファイルを検索できない理由と対策 | マイナビニュース」
http://news.mynavi.jp/column/osxhack/169/index.html
0766名無しさん@お腹いっぱい。
2016/09/24(土) 23:20:43.06ただ現実に必要になってみると
find . -name `echo "オランダ.png" | iconv -f UTF8 -t UTF8-MAC`
これ毎回打ち込むの面倒だなと思ってコマンド化してみた次第です。
0767名無しさん@お腹いっぱい。
2016/09/24(土) 23:54:36.900768名無しさん@お腹いっぱい。
2016/09/24(土) 23:56:11.170769名無しさん@お腹いっぱい。
2016/09/25(日) 00:01:20.090770名無しさん@お腹いっぱい。
2016/09/25(日) 02:09:32.85>>終端を表す \; の \(バックスラッシュ) が消えちゃうんですね。
普通にfindするときもfindに渡る前に¥は消えるでしょ
find2(){
find $(echo "$@" | iconv -f UTF-8 -t UTF8-MAC)
}
じゃダメなの?
0771名無しさん@お腹いっぱい。
2016/09/26(月) 14:04:28.330772名無しさん@お腹いっぱい。
2016/09/26(月) 23:31:45.320773名無しさん@お腹いっぱい。
2016/10/16(日) 10:27:03.83ワイルドカードが展開されて「find /tmp -name AABB」となってしまいますが、
これを「find /tmp -name
0774名無しさん@お腹いっぱい。
2016/10/16(日) 10:36:38.42以下のスクリプトはカレントディレクトリに「AABB」というファイルがあると
ワイルドカードが展開されて「find /tmp -name AABB」となってしまいますが、
これを「find /tmp -name "AA*"」とさせるにはどうすればいいのでしょうか?
#!/bin/sh
name="AA*"
option="-name $name"
find /tmp $option
---------------------------
$ ls
AABB test.sh
$ ls /tmp
AACC
$ sh -x test.sh
+ name=AA*
+ option=-name AA*
+ find /tmp -name AABB
/tmp/AACC をヒットさせたくて
下のように変数の書き方を色々変えてみましたが、うまくいかず
悩んでます。
name="AA"*""
name="AA\*"
name="AA\"*\""
option="-name "${name}""
option="-name \${name}"
0775名無しさん@お腹いっぱい。
2016/10/16(日) 10:45:33.830776名無しさん@お腹いっぱい。
2016/10/16(日) 10:53:11.25全角にするけど
option=”-name \”$name\””
とすればよろし
0777名無しさん@お腹いっぱい。
2016/10/16(日) 11:06:04.27ウェブブラウザで書いてて、書き込んでいいですかの確認画面を経由して書き込むと切れちゃう
俺調べ
0778名無しさん@お腹いっぱい。
2016/10/16(日) 13:48:12.77#!/bin/sh
name="AA*"
find /tmp -name "$name"
ってやればいいのに
0779名無しさん@お腹いっぱい。
2016/10/16(日) 13:54:36.43option="$option 他のオプション"
とかやりたいんじゃないの
0780名無しさん@お腹いっぱい。
2016/10/16(日) 17:25:04.68まさにそれだったわ。情報ありがとう
0781名無しさん@お腹いっぱい。
2016/10/16(日) 18:08:50.16find の検索パスにワイルドカード使ってたらだめ
0782名無しさん@お腹いっぱい。
2016/10/16(日) 19:22:23.01# name=
0783名無しさん@お腹いっぱい。
2016/10/16(日) 19:25:37.68スクリプトソース貼るのに致命的だな
0784名無しさん@お腹いっぱい。
2016/10/16(日) 19:40:18.840785名無しさん@お腹いっぱい。
2016/10/26(水) 22:58:52.490786名無しさん@お腹いっぱい。
2016/10/26(水) 23:40:35.700787名無しさん@お腹いっぱい。
2016/10/29(土) 21:05:55.08むかしリダイレクトとtailでやったらうまく行かなかった覚えがあってやめた気がする
0788名無しさん@お腹いっぱい。
2016/10/29(土) 21:22:36.46cmd > >(tee stdout.log) 2> >(tee stderr.log)
0789名無しさん@お腹いっぱい。
2016/10/29(土) 22:19:49.670790名無しさん@お腹いっぱい。
2016/10/30(日) 09:23:07.74で出来ないか?
0791名無しさん@お腹いっぱい。
2016/10/30(日) 21:41:34.72{ { cmd | tee stdout.log 1>&3; } 2>&1 | tee stderr.log 1>&2; } 3>&1
・bash: 標準出力、標準エラー出力をファイル、画面それぞれに出力する方法 - Qiita
http://qiita.com/laikuaut/items/e1cc312ffc7ec2c872fc
0792名無しさん@お腹いっぱい。
2016/11/04(金) 12:24:35.95この時ファイル名とmp3タグにはCDDBから読み込んで来る。
これをやるのに手っ取り早い方法ってなんだろ
0793名無しさん@お腹いっぱい。
2016/11/04(金) 12:26:20.170794名無しさん@お腹いっぱい。
2016/11/04(金) 12:31:52.740795名無しさん@お腹いっぱい。
2016/11/17(木) 04:52:04.55curl でhttp の応答をチェックしたいのですが
下記みたいにしてもちゃんと判定できないのですが何が原因でしょうか?
test $(curl -XHEAD -s -i https://www.google.co.jp | awk NR=1) = 'HTTP/1.1 200 OK';echo $?
0796名無しさん@お腹いっぱい。
2016/11/17(木) 06:02:01.01$ [ $(curl -I http://localhost/ 2>&- | head -n 1) = 'HTTP/1.1 200 OK' ]; echo $?
bash: [: too many arguments
2
$ [ "$(curl -I http://localhost/ 2>&- | head -n 1)" = 'HTTP/1.1 200 OK' ]; echo $?
0
$ [ "$(curl -I http://localhost/dummy 2>&- | head -n 1)" = 'HTTP/1.1 200 OK' ]; echo $?
1
っとちょっと色々違うけど、うちでは之でなんとかなってる
0797名無しさん@お腹いっぱい。
2016/11/17(木) 06:27:40.74■ このスレッドは過去ログ倉庫に格納されています