10/03/07 16:24:31 /xXz4ARQ
>>665
おまえは質問者の質問意図がわかってない
667:login:Penguin
10/03/07 16:27:22 CtU/xHgd
>>666
わかるわけない。
whileにパイプでつないでサブシェルになるからどうとか、
そういうので困ったことないから。
668:667
10/03/07 16:29:06 CtU/xHgd
っていうか、
実用上、それをどうしても使わないと書けないものなんてあるの?
例を示せるなら示してほしいもんだね。
669:login:Penguin
10/03/07 16:31:06 lFJTxoe3
おい、誰かこの馬鹿をつまみだせ
670:login:Penguin
10/03/07 16:33:48 CtU/xHgd
>>669
だから、実用上どういう意味があるのか教えてくれれば
言われなくても出ていくけど。
671:login:Penguin
10/03/07 16:42:38 lFJTxoe3
変数の扱い方が知りたかっただけろ。
例としてとりあえず適当に思いついたdateを使ったんだろう。
ただの一例なんだから実用上は別に意味ない。
672:667
10/03/07 16:47:13 CtU/xHgd
catコマンドを使ってファイルの中身を出力してパイプでwhileにつないだとか、
そういうのならわかるんだがな。
もっとも、その程度ならパイプ使わないで書けばいいだけだが。
だから、どんなことをキッカケにそんな質問が出てきたのかよくわからん。
まぁ、興味本位で意味のないことする人ってのもいるんだろうけどさ。
ガソリン車に灯油を入れてみるとか、
トラックでレールの上を走ってみるとか。
俺から見ると、そういう変人と同レベルの質問に見えるのさ。
673:login:Penguin
10/03/07 18:49:32 kzHmHVjG
(キリッ
674:login:Penguin
10/03/07 18:57:12 T97Hz24h
頭の中でdateを適当なものに置き換えればいいだけじゃん。
質問する上での便宜かもしれないってのに
いちいち突っ掛かってくるヤツってなんなの?
675:login:Penguin
10/03/07 19:44:39 CtU/xHgd
>>674
dateだからダメとかだけじゃなく、それ以前に変な質問だろ。
>>654の
>それがPOSIX仕様なら、一時ファイルを作る以外に、よい回避方法はありますか?
に対する答は「パイプを使うな」。
>>661の
>3以上のfdを使う方向でいこうと思います。
に対しては「他に手段がないならさておいて・・・正気か?」。
676:login:Penguin
10/03/07 22:20:17 EI1vZsn/
だから、お前はそもそもまともなスクリプトも書けないのに、容喙せんでいい。
677:login:Penguin
10/03/07 23:06:32 qcuqADXg
>>676
あれほどアホな質問しない程度には書けるが。
質問者が何をやろうとしてるか知らんが
意地でもパイプでwhileに投げて実現しようとしてんだろ?
まともな神経してたら別の方法でやるのにさ。
っていうか、質問者を擁護してる君も質問者みたいな書き方すんの?
合理性を考えたほうがいいよ。
678:login:Penguin
10/03/07 23:27:59 s4PVEnib
見ない間に核心つかれてるし
ここのキチガイはLIFEも低そうだし
なむなむ
679:login:Penguin
10/03/08 08:59:52 /FTwkaX/
mkfifoでnamed pipe作って使う手もあるな。
mkfifo fifo;
date > fifo&
while read line < fifo ; do last="$line"; done; echo "THE LAST: $last"
rm fifo
680:login:Penguin
10/03/09 20:30:43 o5fd938a
command 2>file.log
で標準エラー出力をファイルに書き出しているのですが、
エラーでない場合も0バイトのfile.logが生成されてしまいます。
エラーでない場合はfile.logは生成しない方法などあるのでしょうか?
681:login:Penguin
10/03/09 20:44:25 NDaUm8+N
>>680
終了ステータスでエラーかどうかわかるじゃん。
682:login:Penguin
10/03/09 20:47:03 LVMm3tsD
↑
ウォーニングは無視ですか?
683:login:Penguin
10/03/09 20:48:59 JIyb876K
0バイトなら削除したらええがな
684:login:Penguin
10/03/09 20:50:37 NDaUm8+N
条件後出しか…
685:login:Penguin
10/03/09 20:52:24 LVMm3tsD
条件を甘く見たお前さんが悪い。
686:login:Penguin
10/03/09 20:57:40 NDaUm8+N
居直られちゃったよ。
687:login:Penguin
10/03/09 21:03:59 o5fd938a
>>683
削除することにしました。
ファイル作らないで良い方法はないのかなー?
688:login:Penguin
10/03/09 22:45:08 wS8nnpNv
2>file.log でファイルが開かれるのは command が実行される前。
エラーがあったかどうか分かるのは、command の実行が完了した後。
file.log の中身が重要かどうかは、実行終了まで分からないのだから、
普通に考えて、後から削除するのが素直ですよね。
素直じゃない例。長くなっても大丈夫か分かりません。
#!/bin/sh
exec 3>&1
cmd='{ ./some.sh 2>&3 1>stdout.log 3>&- ; } 3>&1 | grep -v warning'
errout=`eval $cmd`
exec 3>&-
if [ -n "$errout" ]; then
echo "there were one or more error"
echo "$errout" >stderr.log
fi
689:login:Penguin
10/03/10 20:15:59 7RM74zt/
久しぶりにマニアックなコード見た。
690:login:Penguin
10/03/12 00:36:34 g58g7Khc
読み解けん;_;
691:login:Penguin
10/03/16 06:49:42 +KO51EwF
一回3に2の出力を出して、空ならthere were one or more errorを1に出力、空じゃなければstderr.logに出力
692:login:Penguin
10/03/16 08:33:07 L4OU7Nfk
>>688
だれか解説よろ
693:login:Penguin
10/03/16 17:36:29 7rwiLleU
グロブで /etc/pass* のリストを得たいのだが、
list=/etc/pass*
だと展開してくれない。
list=$(ls /etc/pass*) ならおkで、改行文字 '\n' 区切りのリストになる。
だが ls のために fork してしまうのが痛い。
どうにかならんのか。
お願いします m(_ _)m
694:login:Penguin
10/03/16 17:41:09 7rwiLleU
あっさり解決した。
printf "%s\n" /etc/pass*
これでいいのか。よくわからんが、printfは組み込みコマンドだったはず。。
695:login:Penguin
10/03/16 17:55:59 oDvWUAap
>>693
試したら展開できたけどな。
696:login:Penguin
10/03/16 17:59:59 jFL6NZ+y
昔はechoを使ったもんじゃ
697:login:Penguin
10/03/16 18:00:18 7rwiLleU
>>695
本当貝?bash?
$ list=/etc/pass*
$ echo "${list[@]}"
/etc/pass*
ダメなんだが。。これをパイプで他のコマンドに渡したいから、ギリギリで展開されても困る。
698:login:Penguin
10/03/16 18:01:26 oDvWUAap
>>697
echo $list で。
699:login:Penguin
10/03/16 18:01:54 7rwiLleU
>>696
echo だと改行文字 '\n' 区切りのリストにならない。
$ list=$(echo /etc/pass*)
$ echo "${list[@]}"
/etc/passwd /etc/passwd-
700:login:Penguin
10/03/16 18:03:33 oDvWUAap
>>699
そんな条件なかったじゃん。
701:login:Penguin
10/03/16 18:05:27 7rwiLleU
>>700
だからprintfを使うことにしたよ。
「一行ずつ」読むコマンドにパイプで渡さないといけないから。
702:login:Penguin
10/03/16 18:06:01 oDvWUAap
後出しで文句言われても……。
703:login:Penguin
10/03/16 18:07:08 7rwiLleU
>>702
いえ事故解決しました、と言った後であなたが展開できましたとおっしゃったので
私はレスをしただけです。
704:login:Penguin
10/03/16 18:08:01 7rwiLleU
あ、どうもありがとう(^^)
705:login:Penguin
10/03/16 18:15:41 m9fA5s2e
for i in /etc/pass*; do echo "$i"; done | command...
706:login:Penguin
10/03/16 18:17:49 7rwiLleU
>>705
すみません、また後出しですが、一応言っておきます。
わざわざ変数 list に格納しているのは、後で自分が参照するからです。
707:login:Penguin
10/03/16 22:36:09 vMRJlqrh
はいはい次どぞー
708:login:Penguin
10/03/16 22:41:29 7rwiLleU
え、いいんですか?次
709:login:Penguin
10/03/20 00:18:55 qKxWTBVf
ファイルから丸括弧(開く) "(" だけの行を読み込んだ際、
if [ \( "$LINE" = "$CHK1" -o "$LINE" = "$CHK2" \) -a \( "$A" = "$B" -o "$C" = "$D" \) ]; then
といったif文でエラーとなってしまいます。
何がまずいのでしょうか?
710:login:Penguin
10/03/20 07:41:24 SCWfCSZ4
>>709
if [ \( "x${LINE}x" = "x{$CHK1}x"
だと通りませんか。
711:login:Penguin
10/03/20 12:14:57 qKxWTBVf
>>710
早速の回答、ありがとうございます。
マシンが平日しか使えないので、火曜日に試してみます。
ところで、$LINE="("の場合だと、
if [ \( "$LINE" = "$CHK1" \) ]; then だとエラーとなりますが、
if [ "$LINE" = "$CHK1" ]; then だとエラーとなりませんでした。
何か書き方が間違えているのでしょうか?
712:login:Penguin
10/03/20 12:17:45 qKxWTBVf
連投すません。
どちらの書き方も、$LINE="(A"とかだとエラーとなりません。
"("の場合のみ、エラーとなります。
なんでだろ?
713:login:Penguin
10/03/20 22:21:20 7Z9+G9O/
例外処理ってどうすればいいだろうか。
for x in ...
do
処理A && \
処理B && \
処理C && \
continue
# エラー?
後片付け、そして次のアイテム
done
サブルーチン化するもの手だけど、それも大袈裟な場合ってどうやるのがスマートだろうか。
すべてを && を繋げる方法しか思いつかない。。
714:login:Penguin
10/03/20 22:33:44 SCWfCSZ4
>>713
URLリンク(www.unix.com)
に、
cleanup_script()
{
echo "Cleaning ..."
}
trap 'cleanup_script' ERR
set -e
ってコードがあったです。set -e が肝らしい。
715:login:Penguin
10/03/20 22:43:49 7Z9+G9O/
>>714
ありがとう。便利ですが、/bin/sh(DebianだとDASH)ではうまく動作しませんでした。
BASHなら問題ありません。
handler()
{
echo "Trap ERR!"
exit 1
}
set -e
trap ?handler? ERR
for x in $(seq 1 10)
do
echo $x
[ $x -eq 5 ] && false
done
実行結果:
1
2
3
4
5
Trap ERR!
716:login:Penguin
10/03/20 22:47:11 7Z9+G9O/
SIGUSR1 30,10,16 Term ユーザ定義シグナル 1
SIGUSR2 31,12,17 Term ユーザ定義シグナル 2
これを使うのもアリか...
717:login:Penguin
10/03/20 23:28:40 7Z9+G9O/
あともう一つ質問!
#!/bin/sh
echo $@
exit 0
というプログラムがあったとして(test.shとする)、
./test.sh 'hoge' 'fuga' > fileA
./test.sh > fileB 'hoge' 'fuga'
をすると、fileAとfileBの両方とも同じ結果になるんだけど、これはどう違うの?
718:login:Penguin
10/03/21 01:59:46 AC+zwoRf
シェルスクリプトで他のサーバにあるファイルを弄ることは可能ですか?
具体的には、
ローカルPC、サーバA、サーバBという3台のPCがありまして
サーバA上の特定のファイルを編集してサーバBにアップロードし、さらにAにある他のファイルをBにアップロードする
という処理をローカル上のシェルスクリプトで自動化したいのです。
しかしsshコマンドで他サーバに繋ごうとするとパスワードを聞かれる所で止まってしまいます。
719:login:Penguin
10/03/21 02:04:15 65tFCowN
つ公開鍵認証
720:login:Penguin
10/03/21 02:11:15 AC+zwoRf
なるほど…やはりそうなるのですね
公開鍵とやらを勉強することにします
mysql -u root -prootみたいに指定できればいいのになぁ
721:login:Penguin
10/03/21 02:16:36 AC+zwoRf
というか、仮にsshで繋げたとしても
実行環境が他サーバに移るわけじゃないし他サーバのファイルをいじるのは無理なのかな?
シェルスクリプトはcdコマンドの実行結果すら次の行に持ち込まないですよね
全ての実行行は独立したシェルで実行されるとか何とかで。
722:login:Penguin
10/03/21 02:36:57 65tFCowN
こんな感じで編集も転送もできる
ssh -i 秘密鍵A ユーザ名A@Aサーバ "任意のコマンド(編集ならsedとかawk)"
ssh -i 秘密鍵A ユーザ名A@Aサーバ "任意のコマンド(転送ならscp -i 秘密鍵B 編集したファイル ユーザ名B@Bサーバ:保存場所 )"
エラー処理とかちゃんとしたいならAサーバに編集、転送用のスクリプト置いてクライアントからは引数だけ渡せばいいし
723:login:Penguin
10/03/21 06:55:40 s8pDEsGz
>>721
expectは?
724:login:Penguin
10/03/21 09:41:21 oiz+h8tr
>>721
>シェルスクリプトはcdコマンドの実行結果すら次の行に持ち込まないですよね
#!/bin/sh
cd /tmp
./hoge.sh
上記は/tmpに移動して、/tmpにあるhoge.shを実行するけど?
725:login:Penguin
10/03/21 10:09:43 s8pDEsGz
ssh host cd /tmp
ssh host ./hoge.sh
こんなアホをやっていると予想。
シェルスクリプトを予めscpで送っておくとか、標準入力の内容をスクリプトとして実効できたり出来ないんかね。
726:login:Penguin
10/03/21 17:30:12 cuEg7ODK
echo "( cd /tmp ; ./hoge.sh )" | ssh host
でいいですよね。
727:login:Penguin
10/03/21 17:55:39 gIM4/doG
>>712
-x をつけて実行してみるとなんとなくわかるかも。
文字列の比較のときは710氏の方式で前後に固定文字を入れたほうが誤動作しにくい。
ただタイプミスだと思うけど、中括弧の位置が間違ってて
if [ \( "x${LINE}x" = "x${CHK1}x"
だけどね。
728:login:Penguin
10/03/21 20:47:12 NvA+aKwG
>>727
ありがとう。
固定文字列を入れて比較するのは、いいアイディアですね。
(なんで思いつかなかったんだろう…)
729:login:Penguin
10/03/24 01:16:09 fusHHN2e
お願いします。
・forの入れ子構造ってOKなんでしょうか?
#!/bin/bash
#nekoneko.sh
for var in aaa
do
for fstype in fs
do
hogehoge=neko
done
echo $var/$hogehoge
done
#sh nekoneko.sh
aaa/neko
期待結果は得られているのですが、勉強中なのであっているかどうかがわかりません。
・forでテキストファイルの読み込みってできないのでしょうか?
dosのバッチで言うところの for /f %%a in (nekoneko.txt) do ~のような方法です。
よろしくお願いします。
730:login:Penguin
10/03/24 01:24:36 KIBvvI04
>・forの入れ子構造ってOKなんでしょうか?
OK
>・forでテキストファイルの読み込みってできないのでしょうか?
DOSのforはしらんが
for a in `cat nekoneko.txt`
でいいのか?
731:login:Penguin
10/03/24 10:02:51 qcQ/2FhI
>>729
インデントしようよ。
全角空白で書くけど、半角空白に変換してくれ。
#!/bin/bash
for var in aaa; do
for fstype in fs; do
hogehoge=neko
done
echo $var/$hogehoge
done
ファイル読んで回すのは while read とか使うんじゃね。
732:login:Penguin
10/03/24 12:47:43 D4crZAMy
>>731
全角空白のインデントはやめろ!
半角空白のほうがいい
お前の専ブラ変えろ馬鹿
733:login:Penguin
10/03/24 12:51:42 D4crZAMy
#!/bin/bash
for var in aaa; do
for fstype in fs; do
hogehoge=neko
done
echo $var/$hogehoge
done
734:login:Penguin
10/03/24 12:58:21 pFOtZDrD
恥ずかしいね。
735:login:Penguin
10/03/24 13:12:41 D4crZAMy
URLリンク(usamimi.info)
URLリンク(usamimi.info)
生ログにはタブと半角空白はきちんと記録されてるから。
素直に表示する専ブラで見れば奇麗にインデントされる。
736:login:Penguin
10/03/24 13:18:59 pFOtZDrD
おいおい、pre要素以外では連続する空白文字は一つにまとめられるのだが。
2ちゃんねるのデータ書式はウンコだけど、連続する空白文字をそのまま
表示する仕様なんてないぜ?
そういうブラウザを押しつけるのはどうなの、って思うけど。
737:login:Penguin
10/03/24 13:25:53 qcQ/2FhI
>>732
うちの環境では半角空白でも見えるけど
相手の環境で見えるとは限らないから。
738:login:Penguin
10/03/24 13:29:31 pFOtZDrD
これはブラウザ依存だと思うね。
空白文字をそのまま扱うものもあれば、HTMLの仕様に準じて無視するものもある。
を使う手もあるのだが、これを同処理するかもブラウザ依存。
まあ2ちゃんねるがクソなんだが。
739:login:Penguin
10/03/24 13:31:53 KIBvvI04
おまいらスクリプトについても語ってやれよ・・・
740:login:Penguin
10/03/24 13:37:19 D4crZAMy
>>737
アンタ良い人だね。
でもな、コード貼る事が多いスレを見てるんなら閲覧者のほうでインデントするブラウザにしたほうがお互いに楽だぜ。
貼るほうもコピーする側もそのまま使えるんだから。うっかり全角空白入れたまま使う事もない。
スクリプトスレなら困る事少いかもだが、全角空白の入ったパッチ貼られたりしたら目もあてらんねぇよ?
741:login:Penguin
10/03/24 13:39:50 qcQ/2FhI
>>740
だから「変換してくれ」って書いたじゃん。
閲覧者の環境まで責任持てん。
742:login:Penguin
10/03/24 13:40:45 qcQ/2FhI
良い人とかってよりも、portability を重視しただけだよ。
書く環境と読む環境が同じとは限らない。
こういう配慮はスクリプト書きもいっしょ。
743:login:Penguin
10/03/24 13:48:01 D4crZAMy
とりあえず「全角空白を推奨」するのだけは勘弁してくれ。
それが無きゃ俺も黙ってさ。
744:login:Penguin
10/03/24 13:53:55 qcQ/2FhI
推奨なんてしてないよ。
745:login:Penguin
10/03/24 14:04:24 D4crZAMy
>インデントしようよ。
>全角空白で書くけど、半角空白に変換してくれ。
インデントは推奨してるが、改めて見直すと全角空白推奨ではないと言われたら確かにそうだな。
いきなり俺の言い方がきつかったのは謝る。数日前にム板で同じような事があってココでもか!と思ったもんだからついな。
すまんかった >ID:qcQ/2FhI
746:login:Penguin
10/03/24 14:05:59 eh1BmETO
藻前ら、モティツケ
/\⌒ヽペタン
/ /⌒)ノ ペタン
∧_∧ \ (( ∧_∧
(; ´Д`))' ))(・∀・ ;)
/ ⌒ノ ( ⌒ヽ⊂⌒ヽ
.(O ノ ) ̄ ̄ ̄()__ )
)_)_) (;;;;;;;;;;;;;;;;;;;)(_(
747:login:Penguin
10/03/24 15:40:14 8MgVQE42
全角文字やTABなどを記号で表示するようにしておけば、
そうそう事故はないのでは?jaspace.elとか便利だよ。
748:login:Penguin
10/03/24 15:52:39 c/AsI/YT
学習用のネタとかならともかくパッチを 2ch に貼んのはやめたほうがいいんじゃね
書き込み確認のとこに
投稿者は権利の何もかもを管理者に無償譲渡することを承諾しますみたいなこと書いてあるぜ
749:login:Penguin
10/03/24 16:12:14 o3qxm3DD
どうしたんだ突然
750:login:Penguin
10/03/24 18:28:22 JGtYY8P/
find -exec command {} +
はもっと知れ渡るべき
日経Linux
751:login:Penguin
10/03/24 21:53:30 LVpGQGYh
xargsに慣れちゃって、手が勝手に打っちゃうんだよな
752:login:Penguin
10/03/25 00:42:02 AS83wWPj
>>730
hww
753:login:Penguin
10/03/25 05:46:35 bk8Jf0RP
ちゃんと理解しながら読んでいればインデントなんて枝葉末節。
自分のコードならばこだわるかも知れないけどね。
754:login:Penguin
10/03/25 07:38:08 woPIYugI
>>728
UNIX板で知った
URLリンク(www.opengroup.org)
の、APPLICATION USAGE から先が勉強になったです。
-a や -o より && や || でつなぐ方がよいとか。お題の部分についてはこれ。
test "$1" = "bat" -a "$2" = "ball"
syntax errors occur if $1 evaluates to '(' or '!'.
One of the following forms prevents this; the third is preferred:
test "X$1" = "Xbat" -a "X$2" = "Xball"
test "$1" = "bat" && test "$2" = "ball"
test "X$1" = "Xbat" && test "X$2" = "Xball"
755:login:Penguin
10/03/25 10:18:07 Bu4gYkWT
>>750
man find
したら、-exec command {} +の下に
-execdir command
とか
-execdir command {} +
とかを見つけた。勉強になった。
こういう事があると電子辞書より紙の辞書の方がいいかもと思う。
756:login:Penguin
10/03/25 23:03:23 AS83wWPj
>>753
とかほざく輩に限ってテストパターンは無限大な開放系のソースを書いちゃうの。
要はモデル化ができてないと。愚直というか馬鹿正直と言うか。
757:login:Penguin
10/03/25 23:09:11 P4/zjZQS
>>745
お前いいやつだなw
758:login:Penguin
10/03/26 03:02:23 y6rsP+OO
>>756 読解力ないんだな(プ
759:login:Penguin
10/03/26 07:00:58 joqM+Eq0
>>758
より多くの人に読解できることを目的にしていないロジックはオナニーだろう。
760:login:Penguin
10/03/26 07:13:10 jyaRuxPh
つまり日本語はオナニー
761:login:Penguin
10/03/26 07:49:22 WwpVuIlf
セックスよりも気持ちいい
762:login:Penguin
10/04/02 15:42:26 la5bZF10
bashなどで標準出力はデフォルトで画面となっていますが、具体的にはどのファイルになりますか?
debianですと/dev以下にあるのだと思いますが。
763:login:Penguin
10/04/02 16:00:38 FvuB/nMw
>>762
ls -l /proc/$$/fd/1
764:login:Penguin
10/04/05 20:18:53 HX4Ssz6U
フラシュメモリ をマウントするとき
# mount /dev/sdb1 /mnt/usb
こんな感じでやると思いますが、
もし、フラシュメモリが挿されていて、かつ、マウントされていない場合これを実行し
その他の場合、実行しないという、シェルスクリプトを教えてください
765:login:Penguin
10/04/05 20:31:37 hbFmdj3V
>>764
問題点は
・フラッシュメモリがささってないことをどうやって判定するか
・マウントされていないことをどうやって判定するか
でしょ。
それシェルスクリプトの話じゃないよ。
766:login:Penguin
10/04/05 21:02:20 HX4Ssz6U
>>765
やはり無理ですか、
・フラッシュメモリがささってないことをどうやって判定するか
・マウントされていないことをどうやって判定するか
ここは、Cか何かで実装し、結果によって、振る舞いを決めるしかなさそうですね
767:login:Penguin
10/04/05 21:12:06 8DwAi4Rq
/dev/disk/by-uuid/ 見てそのUSBメモリがささってるか判定して
マウントは /proc/mounts とか /etc/mtab 見ればわかる
768:login:Penguin
10/04/05 21:58:19 HX4Ssz6U
>>767
できました、ありがとう。
それにしても
>それシェルスクリプトの話じゃないよ。
とは・・・・
769:login:Penguin
10/04/05 22:26:27 bIAGjuYt
え、どこがシェルスクリプト?
770:login:Penguin
10/04/05 22:26:30 V3kmV0qU
シェルの機能に全く関係ない話だから、スレ違いと言われても仕方ない
771:login:Penguin
10/04/05 23:04:52 10PWkAma
>>769-770
君たちはきっとUNIX板のシェルスクリプトスレのほうが馴染むよ
向こうに移ったら?
772:login:Penguin
10/04/05 23:09:37 Do3l7NFE
シェルの文法と組み込みコマンド以外は
スレ違い。
773:login:Penguin
10/04/06 00:29:43 cl/KUIMr
そこまでは言わないけどさ、
>>764 のスクリプトって
>>765 && mount /dev/sdb1 /mnt/usb
で終わりじゃん。
あとは >>765 の条件をどう書くかだけ。
そこはシェルスクリプトの話じゃない。
774:login:Penguin
10/04/06 23:07:19 hKo4mn1/
退屈すぎるんだよ
ただ手順を羅列していくだけの命題はこのスレではシェルスクリブトではない判定
775:login:Penguin
10/04/08 12:37:33 FdKyqazj
/path//mydirというディレクトリが確かに存在します。
rm -rf path/mydir
とすれば削除できるのに
if [-d /path/mydir ]; then rm -rf path/mydir
とすると削除できません。
何故でしょうか。
776:login:Penguin
10/04/08 12:49:32 BdM60+Gl
すばやくシェルスクリプトを作る方法を教えてください。
777:login:Penguin
10/04/08 13:03:15 ahHfR+UP
>>775
if [ -d /path/mydir ]; then rm -rf /path/mydir
778:login:Penguin
10/04/08 13:11:54 YRM82Sus
>>776
俺は指におもりをつけて毎日8時間訓練している。
だいぶ重いスクリプトも楽々書けるようになった。
でもやり過ぎには注意な。
知り合いに、焦点性ジストニアになってシェルスクリプターへの道を絶たれたやつが何人も居る。
779:login:Penguin
10/04/08 15:13:49 FdKyqazj
揚げ足はいいからさっさと答えろボケ
780:login:Penguin
10/04/08 15:21:34 0e8PS1D/
まず服を(ry
781:login:Penguin
10/04/08 15:24:54 rTqLBiaG
>>779
問いが支離滅裂なので回答不能です
782:login:Penguin
10/04/08 15:27:17 ahHfR+UP
>>779
ん? >>777 じゃ違った?
んじゃ権限まわりを確認。
783:login:Penguin
10/04/08 16:01:31 P25bssZd
いきなりifとrmまとめずに
if [-d /path/mydir ]; then echo hoge
がhogeを出力するかどうかぐらい切り分けしようぜ。
784:login:Penguin
10/04/08 16:03:13 ahHfR+UP
>>783
[ と -d は離さないとだめだよ。
785:login:Penguin
10/04/09 16:33:43 8l460jgK
最近の初心者は、[ も一つのコマンドであることすら知らんのか?
786:login:Penguin
10/04/09 16:36:53 wbxQcOPK
昔の初心者もそうだよ。
787:login:Penguin
10/04/09 17:26:28 ZKESoIes
おじいちゃん、乙!
788:login:Penguin
10/04/09 19:57:43 1H+gjPy/
[ ってコマンドだったの?
玄人だけど始めて知ったよ?orz
789:login:Penguin
10/04/09 20:04:23 5ssP89Ht
LPICレベル3coreに受かったばかりの素人だけど
[]はtestコマンドの略式じゃなかったかな
790:login:Penguin
10/04/09 20:26:24 wbxQcOPK
>>788
type [
help [
791:login:Penguin
10/04/09 20:27:45 i0zzyora
>>788
コマンドじゃないなら何なんだよ
792:login:Penguin
10/04/09 22:04:47 +RKMLUfB
>>791
構文。
C言語の == は関数ではないし。
793:login:Penguin
10/04/09 22:06:05 StH4VNmO
昔は、[ は test へのハードリンクと決まってたもんだが、
いま手元のFedora 12を見たらそうじゃなかった。(ファイルサイズも違うし…)
やっぱり日々勉強ですな。
794:login:Penguin
10/04/09 22:10:28 wbxQcOPK
>>793
coreutils の lbracket.c 読んでみ。
795:login:Penguin
10/04/09 22:27:52 StH4VNmO
>>794
読んだ。
面白いけど、Coolとは言えんなぁ…
796:login:Penguin
10/04/10 23:41:09 IGsQWo8s
grepで検索行以外の行を抽出する方法は無いでしょうか?
797:login:Penguin
10/04/11 00:27:05 eH4Novr7
grep -v '文字列'
798:login:Penguin
10/04/11 00:34:34 3KDsWIIS
>>797
ありがとう
799:login:Penguin
10/04/11 16:13:06 1yJmv1GD
初めてシェルスクリプトを加工としていまうs
サブルーチンを作る参考にしようと#!/bin/shなファイルを見ているんですが
関数を使ったスクリプトはほとんどありません
こういうものでしょうか?
任意の値を返せないのでグローバルな変数を介する必要があると思いますが
保守性が低下しないうまい定義の仕方というのはあるんでしょうか
あるいは関数を使わなくてもいいようなシェルスクリプトの特有のコンセプト
とか書き方があるんでしょうか
漠然とした質問ですいません
800:login:Penguin
10/04/11 16:21:22 ESnWs44w
漠然としてるねぇ。
もうちょっとスクリプト書きに慣れてから考えればいいんじゃないかな。
801:login:Penguin
10/04/11 17:04:57 btbPPhym
いやそれより、初心者向きの参考書でも買って
一からじっくり勉強した方が良いと思う。
>>799は、ここで質問して解決するスキルレベルに程遠い。
802:login:Penguin
10/04/11 17:49:36 O63F6ul8
>>801さんまじかっけー
803:login:Penguin
10/04/11 20:21:58 bAKRtVTC
>関数を使ったスクリプトはほとんどありません
>こういうものでしょうか?
いえ。
ただ、スクリプトは、
1) 手っ取り早く仕上げる事が多いので十分に最適化されない
2) 最適化されたスクリプトは必ずしも可読性がよくないので敢えて最適化しない
といったことはあると思います。
804:login:Penguin
10/04/11 20:51:15 eH4Novr7
わざわざ外部関数までつくって何でもシェルスクリプトでやるより多言語から単体のシェルスクリプト叩かせたほうが安心できる
805:login:Penguin
10/04/12 01:55:25 56zfLj4c
>>803
回答ありがとうございます
最適化というのがどういうものか具体的には分かりませんが、例えば関数を組み合わせようと
すると値をやり取りするグローバル変数が必要になるのではと考えました。しかし、必要に
なるごとに関数内で定義、参照するとそういった変数がどこでどう利用されているか確認しなければ
ちょっとした変更も危険になると思います。あるいはメインの手続き側に定義を羅列するとしても
どう利用するのかはコメントでもしないかぎり分からないし、そもそも構造内部を関数へと段階的に
隠蔽する目的を果たせなくなってしまい、やはり可読性保守性は低下します。一方でルールベース
の対策でこういった問題を解決できるようにも感じたので、そういったことについてベーシックな議論を
している人たちがいるのではと思い質問しました。
しかしこのスレッドを読んでいると>>803(1)や>>804にあるように、そういう道具だと割りきって使う
ものだという風にも思いました。シェルスクリプトの欠点を何千万人もの人があえて見なかったこと
にして使っているとすると、とても面白いことですね。それだけ目的を満足させる道具で、また知っ
て初めて分かる魅力があるということなんでしょうかね
(2)については一枚目から鱗が落ちました。習作のつもりでUTF8のテキストをEUC-JPに変換して
からa2psでポストスクリプトを生成するコードを再発明しているのですが、たしかに関数を使っても
全然読みやすくなっていない! いや、正確には処理の始点と大枠の処理の流れは把握しやすく
なっていますが、コード量は後付けでどんどん増加するし、ちょっとした読みやすさのために定義
したマクロ的関数は、それ単体でみるとなんとも得体の知れないものになっていました。
色々な機能を試したいというのもあるのですが、やはり簡潔で読みやすいコードを書くということを
前提にして、そのうえでシェルスクリプトらしい書き方を身につけるようにします
806:799,805
10/04/12 02:02:53 56zfLj4c
勢いでいい子ちゃんぶった嘘をつきました・・
たぶん動けば汚くてもいいやの精神でなんだかよく分からないコードを書き続けると思います
ゴメンナサイです
807:login:Penguin
10/04/12 11:43:55 Qe0ukjkj
/usr/binの中に'['とかゴミがあったので削除したら、起動しなくなったという
笑い話をよく聞いたな。
808:login:Penguin
10/04/12 12:14:55 Cm3bm4a3
>>807
ほう、それは初耳だ。
いまどきの sh は [ を内蔵しているので、
外部コマンドの [ を意図して呼ばないかぎり存在しなくても問題ない。
[ が外部コマンドだった昔は、[ は /usr/bin ではなく /bin にあった。
# つーか、/usr/bin/[ なんて今でも linux だけ。
809:login:Penguin
10/04/12 13:13:25 s3PYGw84
ここはLinux板ですから
810:login:Penguin
10/04/12 13:31:44 FrL0zKPd
「[ を消してうんぬん」は Linux 以前の時代の話だと思う。
811:login:Penguin
10/04/12 18:27:16 rk0wy3GT
プロプラの古いshを使ってないと通じないジョークだな
812:799
10/04/17 23:26:31 f4tmK5PF
先だっては大変お世話になりました
なんとか動くっぽいもの書けました
根本的に間違ってるところやイディオムに直すべきところなど多々あるんだろうと
思うんですが、身近に聞ける人がいなくて困ってます。ので誰かにレビューして欲しいです
なにとぞ、なにとぞー
URLリンク(up.af)
813:799
10/04/17 23:38:16 f4tmK5PF
すんません私のファイルはこっちでした
上のTシャツおっぱいは忘れてください^^
URLリンク(up.af)
814:login:Penguin
10/04/17 23:41:35 xq8djkPZ
わざ。わざ
815:login:Penguin
10/04/18 13:57:11 XFWJRzoK
献上品のTシャツおっぱいが404なので眺めるだけな
>#!/bin/sh
dashで動作確認したのなら素直に#!/bin/dash
> file_num=`expr $file_num + 1`
exprいらなそう
file_num=$((file_num + 1))
> local num=0
> for num in `seq 1 $file_num`; do
> source_files_get $num
> MESSAGE "converting: $file"
> cat "$file" | $NKF -e > "$temp_dir/${file##*/}"
> done
seqとcatいらなそう
local num=1
while [ $num -le $file_num ]; do
source_files_get $num
MESSAGE "converting: $file"
$NKF -e "$file" > "$temp_dir/${file##*/}"
num=$((num + 1))
done
>local status=1
local使う意味なし&多分bashでコケる
816:login:Penguin
10/04/19 01:23:48 ZAvND9//
>>815
式展開というものが色々あるんですね
むやみに外部コマンドを呼ばないという発想もなかったです
マニュアルを引いてあれこれ確認したいと思います
レスありがとうございました
817:login:Penguin
10/04/21 22:02:51 CZfDlwcf
>>813
python風のループだな。
LLみたいに関数を使いたければ値をやり取りするフレームワークを書けばよいかも。
818:login:Penguin
10/04/22 23:27:27 eajRO0wt
commandA > file
commandB > file
と
{ commandA; commandB; } > file
はどっちの方がいいの?
後者の場合は、シェルによってはサブシェルが起動するって聞いたけど本当貝。
819:login:Penguin
10/04/22 23:48:35 sUoTjkov
>>818
上意味違うだろ。
820:login:Penguin
10/04/22 23:52:47 eajRO0wt
間違えた!
前者は
commandA > file
commandB >> file
821:login:Penguin
10/04/23 00:01:08 sUoTjkov
正直、目くそ鼻くそじゃね?
822:login:Penguin
10/04/23 00:03:10 4U7Ovp/A
そう?
じゃあ気にしないでいいか。
823:login:Penguin
10/04/23 00:10:54 Odx5g+6A
悩んでるうちに書いて実行した方が仕事は早く終わるだろ。
824:login:Penguin
10/04/23 05:48:09 0SL93pt/
>>818
後者のほうが効率いい
825:login:Penguin
10/04/24 12:19:07 uV1EwGDC
>>824
スクリプトの一文が長すぎる。
パイプラインもメンドイ。
826:login:Penguin
10/04/24 22:06:24 F/lhQSxk
>>818
前者の場合、commandAの出力はどうなるのかな?w
827:login:Penguin
10/04/24 22:21:58 loCBys/t
↑
大丈夫かな、この人・・・
828:login:Penguin
10/04/24 22:57:54 XH+rWnSs
笑っとけ笑っとけ。
829:login:Penguin
10/04/24 23:02:02 /2NBYvX3
>>826
修正してるじゃないか、 >>820で
830:login:Penguin
10/04/24 23:03:08 loCBys/t
恥ずかしいね
831:login:Penguin
10/04/24 23:51:55 ra/w56Dm
>>825
あれで長いって、普段どんなスクリプト書いてんだ?
832:login:Penguin
10/04/25 09:35:32 iXPvNLwg
>>831
いや、引数が100個とかになってきたら。
潰しが利かない。
833:login:Penguin
10/04/25 09:37:17 pW61wlqY
意味不明
834:login:Penguin
10/04/25 09:39:20 iXPvNLwg
>>833
脊髄じゃなく、脳で考えてください。
835:login:Penguin
10/04/25 10:09:49 ZtdJByaw
その価値のある文章を頼む。
引数とはどの部分の引数なのか?
潰しが利かないという主張の根拠は?
836:login:Penguin
10/04/25 10:39:21 MLqGsd45
これ以上この話を続けても有益な情報は得られないと思う。
837:login:Penguin
10/04/25 11:27:46 iXPvNLwg
>>818
commandA > file
commandB >> file
と
{ commandA; commandB; } > file
コマンドが100個になったのでwhileで省力化したい。
上の方
rm -f file 2>/dev/null
while read cmd;do
$cmd >> file
done < cmds.txt
下の方
xargsを使えば出来そうだけど{}が内部コマンドなのが気になる。
1行のコマンドラインの文字数制限があるシェルもある。
ので、汎用性が無い。
838:login:Penguin
10/04/25 11:34:27 iXPvNLwg
制御構造の使えないシェルスクリプトなんて、バッチファイルの如く、無価値である。
839:login:Penguin
10/04/25 11:37:39 GR3waYM0
>>837
よくわかんねえけど
そのcmd.txtって、事実上シェルスクリプトだよな
単に
sh cmd.txt >file
でいいんじゃねえの
840:login:Penguin
10/04/25 11:46:22 gQNuPSjh
wwww
841:login:Penguin
10/04/25 11:49:42 iXPvNLwg
>>839
そだな。それが最適解だ。
842:login:Penguin
10/04/27 22:06:55 HNWNlh/r
for((i=0; i<6; i++)){
array=("${array[@]}" "i")
}
echo "${array[@]}"
これを実行すると下記のように出力されます。
0 1 2 3 4 5
カンマ区切りで下記のように出力する方法ありますか?
0, 1, 2, 3, 4, 5
843:login:Penguin
10/04/27 23:08:31 3UTvz9hd
>>842
最後の出力を実現するのなら seq -s ', ' 0 5 で済むけど、
配列の各要素を任意の区切文字で繋げて出力する方法を知りたいということかな
zsh/ksh なら echo ${(j:, :)array} でできるけど、bash でどうなのかは知らない
844:login:Penguin
10/04/27 23:18:40 HNWNlh/r
>>843
説明不足で申し訳ないです。
配列の各要素をカンマ区切りで出力する方法です。
・訂正します
array=(1 2 a b 3 c )
echo "${array[@]}"
これを実行すると下記のように出力されます。
1 2 a b 3 c
カンマ区切りで下記のように出力する方法ありますか?
1, 2, a, b, 3, c
echo ${(j:, :)array} は使えませんでした。
845:login:Penguin
10/04/27 23:37:13 wOLuHHkh
>>844
IFS="," ; echo "${array[*]}"
846:login:Penguin
10/04/28 10:15:03 ttzp8AMm
echo "${array[@]}" | sed 's/ /, /g'
847:844
10/04/28 11:26:50 +626EOW1
>>845-846
できました!ありがとうございました。