1 名前:名無しさん@お腹いっぱい。 mailto:sage [2017/03/20(月) 12:07:26.41 .net] シェルスクリプトの総合スレです。 □お約束 ・特記なき場合はBourne Shell(/bin/sh)がデフォルトです。 bash/zsh/ksh/ashなどに依存する場合は明示しましょう。 Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。 FreeBSDユーザは/bin/shの正体がashなので注意。 v7 shに一番近くて、現役のshは、OpenSolaris由来のheirloom sh。 src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/ heirloom.sourceforge.net/sh.html ・csh/tcshのシェルスクリプトは推奨されません。 (理由は「csh-whynot」でググれ) ・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。 manや参考リンクを見ましょう。 aproposないしはman -kでそれらしい単語による簡単な検索もできます。 ・シェルで使えるワイルドカード等は正規表現ではありません。 正規表現の話題はスレ違い(正規表現スレへ) ・シェルスクリプトのことをシェルってゆーな □初心者へのアドバイス: ・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも awkまたはperlの方が適した処理にはそちらを使いましょう。 ・知らないコマンドが出てきたらmanを引きましょう。 ・思い通りに動かないときは、まずは sh -x でトレースしましょう。 □回答者への注意事項: ・シェルスクリプトでの処理方法を質問しているのに、よくわからずに 「そういうのはperl使いましょう」と回答するのはやめましょう。 安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。 前スレ シェルスクリプト総合 その25 echo.2ch.net/test/read.cgi/unix/1439563321/
891 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 23:40:07.60 .net] 実装オプションにつけてあるIDコードの一つみたいだな。 コードの一覧は ttp://pubs.opengroup.org/onlinepubs/9699919799/help/codes.html にある。 オプション機能なので、実装されてるとは限らない。
892 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 00:40:09.23 .net] LINENOが仕様どおりに実装されてないのは この際見なかったことにして、現在使われてる POSIX準拠シェルで完全に実装されてないものなんて有るの? そもそも現在使われてるPOSIX準拠シェルってどんなのがあるんだろう bash、ash、dash、zsh、ksh、mksh、yash、posh 他に知ってる?
893 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 16:31:32.55 .net] $LINENO使って何をしたいんだろ
894 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 19:01:06.26 .net] デバッグログ以外になにかあんの? だからこそデバッグログとして使えない $LINENOを何のために作ったのか理解できない
895 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 19:14:03.26 .net] ${(%):-%I}
896 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/14(土) 20:10:19.92 .net] $ ${(%):-%I} -bash: ${(%):-%I}: 誤った代入です
897 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/17(火) 22:14:01.26 .net] https://ja.wikipedia.org/wiki/IOCCC > ^ Bourne Shellのソースコード( minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh )は > マクロ( minnie.tuhs.org/cgi-bin/utree.pl?file=V7/usr/src/cmd/sh/mac.h )を使用した > 「ALGOLのような見た目のC」で書かれていることで悪名高い
898 名前:名無しさん@お腹いっぱい。 [2018/04/18(水) 10:39:06.43 .net] 自己解凍するファイルって便利だな シェルスクリプトで解凍とインストール手順を記述して それをバイナリと結合するだけでmsiみたいなことができる
899 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 15:04:27.31 .net] >>875 それはちなみに sh アーカイブ形式って呼び名がついてる。 sharっていう自己解凍シェルスクリプト作成専用コマンドも昔はあった。 なお、ウイルスやマルウェアの温床だということで廃れた模様。
900 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 15:22:26.44 .net] sharはそれでインストールまでするというより、tar.gz などのバイナリファイルを テキストにしてメールやニュースで送るために使うことが多かった
901 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 16:21:07.45 .net] >>877 へー、uuencodeしか知らんかった
902 名前:872 mailto:sage [2018/04/18(水) 21:50:42.61 .net] あーわりと昔からある手法なのね…… VMware Horizon Clientのインストールイメージがその形で,俺は正直そういうシェルスクリプトとバイナリが結合されてるファイルを始めて触ったんで 画期的なアイデアに思えたんだわ……
903 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 23:47:33.56 .net] echo "1 + 2" | bc > /tmp/a とすると/tmp/aには2バイト、16進数で 33 0a のデータが入っています。 a=$(echo "1 + 2" | bc) printf "$a" > /tmp/a しかしこうすると$aには1バイトしか入ってないようです。 また [ "$(printf '1')" = "$(printf "1\n\n\n\n\n")" ] これは一致した文字とみなされるようです こういった挙動はどこを見れば理解できるでしょうか?
904 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/18(水) 23:55:18.86 .net] a="$(printf '1\n\n\n')" とやってもaには1しか入っていない a="$(printf '1\n\n\n2')" しかしこうすると5バイト入ってる その状態から a=${a%?} を末尾の2を削除すると a には4バイト、1\n\n\n が入っている うーん?
905 名前:名無しさん@お腹いっぱい。 [2018/04/19(木) 00:06:08.07 .net] >>880 コマンド置換 $(...) の仕様 pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_03 > removing sequences of one or more <newline> characters at the end of > the substitution. Embedded <newline> characters before the end of > the output shall not be removed; however, they may be treated as > field delimiters and eliminated during field splitting, depending on > the value of IFS and quoting that is in effect. If the output > contains any null bytes, the behavior is unspecified. bashのマニュアルにも同様の記述がある linuxjm.osdn.jp/html/GNU_bash/man1/bash.1.html#lbBC > bash は command を実行し、 command の標準出力でコマンド置換の部分を > 置き換えます。この際、末尾の改行文字は削除されます。 文字列の途中に > ある改行文字は削除されませんが、 単語分割の際に削除されることがあり > ます。
906 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:06:21.64 .net] かといってこうやると4バイトでてるんだよなー printf '1\n\n\n' | hexdump.exe -C
907 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:19:37.42 .net] コマンド置換の仕様かぁ 普通のやり方ではコマンドの出力結果を変数に入れるときは 末尾の改行は絶対消えるってことかなー read使えばって思ったけど、あっちは改行区切りだしなー ちなみに $aに1\n\n\nを無理やり入れて、 $bに1を入れて [ "$a" = "$b" ] で比較したら不一致になったよ
908 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:24:31.94 .net] あたりまえやろw
909 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/19(木) 00:54:10.53 .net] よくこんな単純なルールで辻褄取れてるよなー 思いつきで考えたとしか思えないルールなのにw
910 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/24(火) 02:26:08.83 .net] 単純なルールのほうが整合性は取りやすいんでは? 寧ろ複雑な規則だと実装に矛盾が生じたりしそう。
911 名前:名無しさん@お腹いっぱい。 [2018/04/27(金) 23:17:19.66 .net] ちょっと質問 偶数日と奇数日で処理を分けたいんだけど、上手くできない どうしたら良いのかアドバイスください #!/bin/sh DATE=`date '+%d'` # 日 を取得 buf=$(( $DATE % 2 )) # 計算 if [ ! $buf ]; then # 偶数 hoge else # 奇数 fuga fi
912 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/27(金) 23:43:49.55 .net] その計算するとこ()の中に$いるっけ
913 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 00:55:01.80 .net] >>888 #! /bin/sh - DATE="$(date "+%d")" if [ $((DATE % 2)) -eq 0 ]; then echo "今日は偶数Day" else echo "今日は奇数Day" fi ある種の言語(
914 名前:Cとかだっけ?)はif文に0を放り込めるけど、 コマンドを逐次実行するだけのシェルスクリプトでは無理。 面倒だけど数値判定をしなきゃいけない。 あと、>>889 氏の言う通り演算置換内の変数に弗記号は不要。 あと、コマンド置換は容易く入れ子にできて対も分かりよい$()を使おう。 POSIX sh 2003でもサポートされているので安心して。 [] [ここ壊れてます]
915 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 01:37:16.44 .net] BSDで標準コマンドだけで現在時刻(もしくは起動してからの)ミリ秒ってとれないのな /proc/uptimeもBSDないみたいだしどうにかして取れないかなー ファイルに書き込んでタイムスタンプで 取れないかなーとかもやってみたりもしたw ファイルシステムによっては書き込まれるみたいだが これも標準コマンドだけでどうやればー できればなにも入ってない素のコマンドだけでやりたいんだよね Perlでもやれるけど、dateコマンドに比べたら 起動時間が10倍も違うんだよな。 あ、ベンチマークというかコマンドの実行速度を細かく知りたいために使いたい。 timeコマンドは標準出力(エラーだっけ?)を乱すので使いたくない
916 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 01:49:17.29 .net] あれとれなかったっけ? なんか取れた気がしたけど気のせいだったか
917 名前:名無しさん@お腹いっぱい。 [2018/04/28(土) 19:41:21.09 .net] >889-890 ありがとうできたよ。bufが空白になって常にelseに倒れてたから助かりました。 $の位置が良くわからなくて困っていたんだ Cならいくらでも書けるんだけど、慣れない言語はちょとね・・・
918 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 20:34:44.86 .net] >>891 timeコマンドの出力は標準エラーだよ。 標準出力の方は乱さない。 標準エラーが乱れる方も (time sh -c '測りたいコマンド 2>&3' 2>/tmp/time.out ) 3>&2 みたいにすれば回避できるから、素直に time コマンド使う方がいい。
919 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/28(土) 23:27:39.64 .net] >>894 もう一つ問題があってなぁ。 dashじゃtimeコマンドビルトインじゃないんだよ ビルトインじゃないからシェル関数で使えないんだよね
920 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 00:02:10.75 .net] まあ使えないわけじゃないし候補にはなるけど、 OSごとに処理分けるの嫌だなぁ
921 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 00:07:48.59 .net] /bin/timeって明示すれば?
922 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 02:10:30.87 .net] もしくは command -p time
923 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 08:34:10.39 .net] いや、だからtimeコマンドだと シェル関数扱えないからだめだって言ってるやん?
924 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 11:24:09.19 .net] 放置で
925 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/29(日) 18:50:59.66 .net] どうぞ
926 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/30(月) 09:52:20.53 .net] mkfifo便利すぎる
927 名前:名無しさん@お腹いっぱい。 [2018/04/30(月) 10:17:56.64 .net] シェルスクリプトの入門書を教えてください ソフトバンクから出てるUNIXシェルスクリプト〜みたいな書名のものがAmazonでは評価高いみたいなんですが… 先輩方のおすすめを教えてください
928 名前:名無しさん@お腹いっぱい。 [2018/04/30(月) 14:27:06.11 .net] >>903 こういう分野に関してはいまだにオライリーは信頼できる書籍を発行してるぜ。 まあ俺の持論だがw https://www.oreilly.co.jp/books/4873112672/ ↑これとか参考になる。コマンドの列挙だけじゃなく、システムとシェルの性質とか非常に基礎的な部分から触れてるのでよい(と思う)。
929 名前:900 [2018/04/30(月) 16:27:23.98 .net] >>904 >システムとシェルの性質とか これ正に知りたいことです 連休中本屋さん行くので是非中身読んで検討します ありがとうございます
930 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 16:02:31.91 .net] コマンドの出力結果を一時ファイルを作らずに 一行一変数に入れたいんですけどい
931 名前:い方法はないでしょうか? 変数はLINE1、LINE2・・・みたいな名前で bash依存になる配列は使わない方針です。 foo | while read -r line; do LINE1=$line done みたいにするとサブシェルだから ループ終わると消えてしまうし [] [ここ壊れてます]
932 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 16:34:46.41 .net] sedかawkで代入文いっぱい出してevalかな。 特殊文字のエスケープちゃんと書かないといけないけど。
933 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 16:42:46.69 .net] cat <<. | 1st Line 2nd Line 3rd Line . while read -r lineval; do ctlino=$((ctlino + 1)) printf '%s%s' 'LINE'"${ctlino}"'='"$(printf '%s' "'")""${lineval}""$(printf '%s' "'")" ';' done | printf '%s%s\n' "$(cat)" ':' とりあえずこうすると LINE1='1st Line';LINE2='2nd Line';LINE3='3rd Line';: という出力が得られる。これを評価すればいいと思ったができねえ。
934 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 16:59:04.80 .net] 改良? cat <<'EOF' | 1st Line 2nd Li'ne 3rd Line EOF while read -r lineval; do ctlino=$((ctlino + 1)) printf '%s' "${lineval}" | sed 's/'"'"'/'"'"'"&"'"'"'/g' | printf '%s%s' 'LINE'"${ctlino}"'='"'""$(cat)""'" '; ' done → LINE1='1st Line'; LINE2='2nd Li'"'"'ne'; LINE3='3rd Line'; :
935 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 17:00:08.10 .net] 改良? cat <<'EOF' | 1st Line 2nd Li'ne 3rd Line EOF while read -r lineval; do ctlino=$((ctlino + 1)) printf '%s' "${lineval}" | sed 's/'"'"'/'"'"'"&"'"'"'/g' | printf '%s%s' 'LINE'"${ctlino}"'='"'""$(cat)""'" '; ' done | printf '%s%s\n' "$(cat)" ':' とりあえず単引用符のエスケープだけ。他にも必要なものがあればsedを挟んでいけばいいんでは。
936 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 17:12:01.86 .net] > sedかawkで代入文いっぱい出してevalかな。 やっぱり残る手はそれか
937 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 17:18:49.70 .net] $ radico rec -id=FMT -s=20180502040000 というコマンドがあったとして、「-s=」あとに今日の朝4時「date +"%Y%m%d"040000」の結果を入れたいんですが、一行で書く方法を教えてください
938 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 17:28:29.77 .net] お前はこの前のレス群に対する結果とか報告してからにしろ
939 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 18:12:16.93 .net] 何も考えずぶん投げるけど変数exportとかじゃだめなのか
940 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 18:28:09.05 .net] 出来ました!
941 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 19:53:51.97 .net] >>912 $ radico rec -id=FMT -s=$(date "+%Y%m%d040000") コマンド置換くらい自力で調べーや
942 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 21:09:33.58 .net] 引数 $1 $2 $3 ・・・ のうち、特定の範囲n〜mを 別の関数の引数に渡すのってどうやればいいだろうか? n〜mは条件で変わるものとする
943 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 21:27:56.41 .net] >>917 一兆個のシェルを書いてきた俺がそんな事必要になった事がないから お前の解こうとしてる問題が間違っている
944 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 21:34:19.62 .net] >>918 やってることが簡単なパーサーのようなものですからね。 exprをシェルスクリプトで実装しているようなものです。 流石にこういう高度なことはやったことがないのでは?
945 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 22:27:50.67 .net] shift $argnum とかは?
946 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 22:47:14.90 .net] >>920 それだと前からn個以降は実現可能だけど 範囲ができないんですよね。
947 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/02(水) 22:51:49.30 .net] bashだとこんな感じですね foo() { echo "${@:2:3}"; } $ foo 1 2 3 4 5 2 3 4
948 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 00:40:42.42 .net] >>921 for文使えば? selectargnum() { fromargnum=$1 toargnum=$2 shift ${fromargnum} for arg in $(seq $((toargnum - fromargnum + 1))); do printf '%s\n' "$2" && shift done } selectargnum 3 5 "$@" 注意: シェル函数への第1,2引数は必ず非負整数で,引数の範囲内であるべし。
949 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 00:47:51.26 .net] #! /bin/sh - selectargnum() { fromargnum=$1 toargnum=$2 shift ${fromargnum} for arg in $(seq $((toargnum - fromargnum + 1))); do printf '%s\n' "$2" shift done } selectargnum 2 4 "$@" もうちょっと親切に書くわ。 シェル函数selectargnumの ::仕様:: selectargnum <開始位置> <終了位置> <(処理したい)引数> 開始位置・終了位置は省略不可で,常
950 名前:識的な範囲であることを前提にしている。 ::使い方:: 上のコードを適当な名前のファイル(例えばselarg.sh)に保存して実行権限を賦与。 $ chmod +x ./selarg.sh あとはファイル中のselectargnum函数の第1,2引数を書き換えて使える。 上の例なら $ ./selarg.sh "第1引数" "第2引数" "第3引数" "第4引数" "第5引数" に対して 第2引数 第3引数 第4引数 という出力が得られる。 [] [ここ壊れてます]
951 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 00:50:36.20 .net] seqを除いてPOSIX準拠。 もしもより厳密にPOSIXに従いたければ当該箇所を seq $((toargnum - fromargnum + 1)) から yes | head -n $((toargnum - fromargnum + 1)) としてもいいだろう。
952 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 03:17:05.15 .net] >>922 のせいで勘違いさせたようですね > 別の関数の引数に渡すのってどうやればいいだろうか? 重要なのはこれ another_function() { for i in "$@"; do printf "%s\n" "$i" done } foo() { another_function "${@:2:3}"; } another_functionはそのまま使って、 fooの部分をPOSIX準拠にして 以下のような出力を得たいということです $ foo a "b 1" "c 1" d e b 1 c 1 d
953 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 03:18:03.35 .net] eval使うしか無いっすかね?
954 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 03:20:16.97 .net] このコードの応用でできますかね? いまいちこのコードがなにやってるのかよくわからんのですが https://unix.stackexchange.com/questions/258512/how-to-remove-a-positional-parameter-from for arg do shift [ "$arg" = "-inf" ] && continue set -- "$@" "$arg" done printf '%s\n' "$@"
955 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 03:42:12.53 .net] >>926 おいおいヒドいな俺の>>923-925 は無視かよ 引数をどうにかしたいコマンドをsomefuncとして #! /bin/sh - selectargnum() { fromargnum=$1 toargnum=$2 shift ${fromargnum} for arg in $(yes | head -n $((toargnum - fromargnum + 1))); do printf '%s\n' "$2" shift done } somefunc() { printf '%s\t%s\n%s\n' "$2" "$3" "$1" } somefunc $(selectargnum 2 4 "$@") こういうので実現できると思うんだが? なにかこれでは駄目な点があれば言ってくれ。 せっかくGW中とは言え頭使ったのにあまりにもあまりな仕打ちじゃマイカ
956 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:08:41.64 .net] >>929 somefuncは分かりづらいんでこう書き換えるけど somefunc() { printf '%s\n' "$@" } $ test.sh "a" "b" "c" "d" "e" b c d こうなるところ $ test.sh "a 1" "b 1" "c 1" "d 1" "e 1" b 1 c 1 d 1
957 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:23:08.37 .net] somefuncはこうしないとだめだな。 何番目の変数に入っているのか分かりづらい somefunc() { printf '1: %s\n' "$1" printf '2: %s\n' "$2" printf '3: %s\n' "$3" }
958 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:23:43.87 .net] なんかすごいどうでもいいことしてる気にならん?
959 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:26:07.99 .net] しょうがないだろう。 引数には空白、シングルクォート、ダブルクォート、改行が 含まれる可能性があるんだよ
960 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:29:26.87 .net] 一見うまくいったと思いきや $ test.sh "a" "b" "c" "d" "e" 1: b 2: c 3: d 変数Aに改行が含まれている文字列を入れ $ A="b b b b " 以下のように実行するとおかしくなる $ test.sh "a" "b${A}b" "c" "d" "e" 1: bb 2: b 3: b > なにかこれでは駄目な点があれば言ってくれ。 駄目な点を言った
961 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:32:29.46 .net] なお、俺が書いたコードだと以下のように正しく出力される $ test.sh "a" "b${A}b" "c" "d" "e" 1: bb b b b b 2: c 3: d >>928 を参考にして以下のように書いた selectargnum() { func=$1 start=$2 length=$3 shift 3 i=0 last=$((start+length)) for arg in "$@"; do : $((i+=1)) [ $i -gt $length ] && shift [ $i -ge $last ] && continue shift set -- "$@" "$arg" done $func "$@" } somefunc() { printf '1: %s\n' "$1" printf '2: %s\n' "$2" printf '3: %s\n' "$3" } selectargnum somefunc 2 3 "$@"
962 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:34:38.30 .net] ただ問題は、>>935 のコードを書いた俺自身が なんでこのコードで動くのかよく分かってない所だなw 誰か俺の書いたコードが何をやってるのか教えてくれw >>928 のコードはなにやら引数を一周させているみたいだ。 俺が書いたコードは、その一周を途中で中断させているようだな?
963 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:37:45.65 .net] eval使ったほうが簡潔かつ速い気がしてきたw set -- の所、何度も引数をずらす処理をしているわけだしね。
964 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:38:19.15 .net] 長い 読む気にならん
965 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:39:32.30 .net] 長くて読まないのはわかるが、 なぜ読まないということをわざわざ宣言するんだろう?
966 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 04:42:04.26 .net] まあ長いのは、>>929 のコードに合わせたからであって、 メインの処理はこれだけなんだけどね i=0 start=2 length=3 last=$((start+length)) for arg in "$@"; do : $((i+=1)) [ $i -gt $length ] && shift [ $i -ge $last ] && continue shift set -- "$@" "$arg" done printf '1: %s\n' "$1" printf '2: %s\n' "$2" printf '3: %s\n' "$3"
967 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 05:49:25.62 .net] >>935 ちょっとリファクタリング(ってほど大層じゃないが) selectargnum() { func="$1"; start=$2; length=$3 shift 3 i=0; last=$((start + length)) for arg in "$@"; do i=$((i + 1)) test ${i} -gt ${length} && shift test ${i} -ge ${last} && continue shift set -- "$@" "${arg}" done "${func}" "${@}" }
968 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 06:31:02.21 .net] >>941 文字増やしてるだけじゃねーかw
969 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 06:31:17.96 .net] 不要な文字
970 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 06:50:55.78 .net] リファクタリングは文字数減らすことを言うのじゃないけど
971 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 07:41:52.01 .net] 不必要な機能
972 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 09:41:05.71 .net] 一旦SQLiteにでも格納すれば何でも出来るで
973 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 12:57:05.87 .net] なんか余計に読みづらくなっただけのような
974 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:11:25.55 .net] 解こうとしてる問題が間違っていると言ったやろw
975 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:13:23.38 .net] bashだと簡単にできるようになったことのどこが 間違っているというのだろうか?
976 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:14:48.71 .net] >>944 > リファクタリングは文字数減らすことを言うのじゃないけど リファクタリングは文字数を増やすことじゃないって話
977 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:16:44.77 .net] >>949 問題が間違っているとハッキリ書いとるやろwアホなん?
978 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:17:25.13 .net] なぜ問題が間違っているというのか? 結論を最初に持ってこないように
979 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:22:50.10 .net] >>952 あ、それが分からんのかw 引数の意味をパースすれば任意の位置指定でのスライスなど不要やからな つまりgetoptで十分な問題を間違った角度から解こうとしとるっつー事やw てかおまえ安価ぐらいできんのか
980 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:33:39.18 .net] どういう理屈で、引数の意味をパースすれば任意の位置指定での スライスなど不要になるのでしょうか?
981 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:41:59.15 .net] >>954 まず安価しろ
982 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:43:07.07 .net] 例えばfindコマンドのように find . -type f -exec chmod 600 {} \; -execが来たら、chmodコマンドを;までをオプションとして 渡して実行みたいなのはスライス相当のものがないとできませんね
983 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:44:07.01 .net] 自分がやったことがないことだからって 問題が間違ってるということにはなりませんよ
984 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:44:46.06 .net] >>953 根本的に何がしたいのかに依るんじゃねーのそれは 引数を解釈したいならgetoptでやるべきだが、今回やりたいのは引数のスライスそのものじゃね? bashなら一行でできるそれをbash依存せずにやるにはどうすればって話なんじゃないか まぁなんか妙なのが湧いてて話が無駄に複雑になってる感が否めないが
985 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 13:47:13.94 .net] まあ言わないでもわかるでしょうが、 わざとスルーされないように言っておきますと、 -execは残りの引数を全て、指定したコマンドの引数として実行するものではなく ; までを引数とします。だから以下のように複数の-execもしていできます。 find . -type f -exec echo {} \; -exec echo {} \;
986 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 13:53:29.10 .net] >>958 位置が固定ならいきなりスライスでも構わんが 今回のやつは任意の位置を指定したいと言っとるやろ つまりその任意の位置がどこか分かった時点で引数の解析は終わっとるから 必要な引数も選別できているはずなんや つまりそこからさらに位置指定でスライスしたいというのは 引数解析のアプローチが間違っとるいう訳やな
987 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:10:06.58 .net] >>960 そして、その選別した引数(複数)を別の関数に渡すんだろ? 配列があれば、配列に選別していった引数を入れていけばいいだろうが bash依存しないなら、配列は使えないよな。 お前ならどうするんだ?
988 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:10:06.74 .net] >>960 任意の位置をどう指定するのかが要望ないからそこは>>922 みたいな位置の直書きを想定してた 多分位置の指定まで引数に組み込むような汎用性高いものは要求されてないだろう つまりいきなりスライスでいいと思ってる
989 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:17:44.04 .net] >>961-962 関数に渡すならその引数に割り当てた変数に保存しとくだけやな 可変個ならevalするやろしw どっちにしろもっと多くの状況がわからんと最適解は得られんわw
990 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:21:33.10 .net] >>963 > 関数に渡すならその引数に割り当てた変数に保存しとくだけやな >>917 を読み返してみましょうか? > 引数 $1 $2 $3 ・・・ のうち、特定の範囲n〜mを > 別の関数の引数に渡すのってどうやればいいだろうか? > n〜mは条件で変わるものとする その引数に割り当てた変数とはなんですか? 結局↓これですか? > 934 自分:名無しさん@お腹いっぱい。[sage] 投稿日:2018/05/03(木) 04:37:45.65 > eval使ったほうが簡潔かつ速い気がしてきたw
991 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:22:57.28 .net] >>964 せやでw こいつは問題を複雑に考えすぎとるだけやw
992 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:23:53.17 .net] あれほど問題が間違っていると偉そうなこと言ったくせに 問題は間違ってないってことでいいんだろうな
993 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:24:26.11 .net] >>965 そっちじゃない。 いきなり問題が間違っているといちゃもんを付けたことに 謝れって言ってる
994 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:25:12.82 .net] >>966 正確には問題自体を複雑に考えすぎとるやなw こいつの問題設定自体が間違っとるんやw
995 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:25:16.94 .net] >>963 > どっちにしろもっと多くの状況がわからんと最適解は得られんわw 最初の質問の>>917 に全て書かれてるじゃん 他に何の状況が知りたいのさ?
996 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:26:18.22 .net] >>968 なんで問題設定に話をすり替えてるの? 問題は>>917 。問題が間違ってるといちゃもんを付けたのは>>918
997 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:26:43.00 .net] >>967 なんやおまえ質問した本人なんかw ならもっと情報をさらけだしてみw おにいちゃん達が手取り足取り教えてあげるやろからw
998 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:28:32.21 .net] >>971 なんだお前が問題が間違ってるといちゃもんつけたやつか? 問題は間違っていませんでした、ごめんなさいって謝れば?
999 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:29:43.06 .net] >>972 せやでw てか教えて欲しいくせに何いきなりキレとんねんw キチガイかおまえはw
1000 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:32:04.43 .net] はぁ?教えてもらうも何も>>935 で自力で解いたし >>937 でeval使ったほうが良いかもって、 それは最初からわかってるよアピール(笑)もしたし お前はなにか役に立ったのか? 俺に問題が間違ってるといちゃもんを付けた挙げ句 結局、俺の足元にも及んでないじゃんw
1001 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:34:28.22 .net] >>974 だからな? もう少し柔軟なアタマと経験を持っとればそんな問題自体にぶちあたらんと言っとるのやでおいちゃんはw 人に教えてもらいたかったらもう少し素直になった方がええでおまえw
1002 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:38:23.58 .net] >>975 お前に経験がないから問題にぶち当たってないんだろうw それで、お前質問に答えずに逃げてるよな? >>960 そして、その選別した引数(複数)を別の関数に渡すんだろ? 配列があれば、配列に選別していった引数を入れていけばいいだろうが bash依存しないなら、配列は使えないよな。 お前ならどうするんだ?
1003 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 14:40:51.17 .net] >>976 いくらお子ちゃまでもナチュラルに話がループするバカにつきあう気はないで生憎w
1004 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 14:40:58.71 .net] 偉そうに>>960 で引数の選別をする方法で できるような言い方をしているということは、 "このやり方の続き" でやる方法も当然思いついてるはず 質問に答えようか。 まさかここまでいって、この方法じゃ実現不可能だった なんていうはずがないよなw
1005 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 15:39:01.57 .net] やたらめったに長ったらしいコード書いたアホが元凶
1006 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 15:57:16.13 .net] たしかに俺のコードは長すぎたし引数に改行が含まれると各行を引数だと見做してしまう 修正が困難な不具合があるからね(もし可能だという方がいるなら是非教えてほしい)。 実は俺自身もシェルスクリプトの経験はあまりないんだ。まだ仕事してねーし。 それが原因で場が乱れたとするなら申し訳ない。 ただ、言わせてもらうが、俺は寧ろ荒れた原因は「問題が間違ってる; 質問は正しい態度で」なんていう 主張をageながら口説いてる奴にあると思うがな。
1007 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:20:04.93 .net] どっちもはしゃぎ過ぎ それに、安価だのageだの馬鹿みたい
1008 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:29:15.75 .net] >>980 いや、だから>>935 で自力で解いたってw eval使ったほうが良さそうだけど (ここまで自力の結論というかeval版は質問前に作っていたがね)
1009 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:29:46.34 .net] >>981 > それに、安価だのageだの馬鹿みたい まったくだw 俺も最初からその2つは無視してるw
1010 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:31:30.06 .net] IDが出ないスレでこれほど見難い言い争いはあんま見ないな。いや醜いかw
1011 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 16:41:10.54 .net] ここって建設的じゃないよな、ホント
1012 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:10:05.54 .net] 自力で解いたっつてんだろ、何度も。偉ぶってんのはどっちなんだか。
1013 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:33:34.69 .net] 醜すぎw
1014 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 17:54:41.55 .net] はい、次スレ シェルスクリプト総合 その27 https://mevius.5ch.net/test/read.cgi/unix/1525337663/
1015 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 19:24:32.42 .net] この人は問題を解きたいんじゃなくて 問題を自分のルールで解かせたいだけなんだと思う
1016 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 19:33:59.23 .net] 自分のルールってなんのことや?
1017 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:13:25.91 .net] そうじゃなくて呈示されたコードの完成度が低くて、かつ 自分で作ったコードが要件を満たしていたから「お前ら馬鹿ばっかだな」になるんでしょう?
1018 名前:名無しさん@お腹いっぱい。 [2018/05/03(木) 20:15:23.07 .net] ただのお子ちゃまやないかw 間違っとる言われてボクは間違ってないてすねとるだけやでw
1019 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:27:22.30 .net] >>991 要件じゃなくて、あれはバグだよ 正しく動いてないじゃないか
1020 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:28:19.18 .net] いまいち誰が誰だかなわからない追うのめんどくさすぎなのに、論評続けるねえ 質問内容に文句つけ続けのオッサン:一理あるが、一理でしかない。しつこいわっ 質問したヤツ:自力で解いたとかウザいわ。だったら最初から質問すんなwおっさんの一理を理解して素直に受け取れ
1021 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:37:05.47 .net] >自力で解いたとかウザいわ。だったら最初から質問すんなw 書いた途端に解が分かったとかザラにあるだろ お騒がせしました、とか書けない人格はアレだけど
1022 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:38:34.10 .net] >>995 一行目は問題にしてない、全く。言う通りだし 二行目を問題にしてる、ほぼそれが全部
1023 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/03(木) 20:58:18.53 .net] 能力はありそうに見えるのにもったいないよね。ああいうので仕事を失しなうってのは。 俺の同僚にも居たわ。正直に言って、俺より優秀だった
1024 名前:フに人当たりが強すぎてやんわり退職させられて 先月会ったらトビやりながら独学でコーディングしてるらしい [] [ここ壊れてます]
1025 名前:名無しさん@お腹いっぱい。 [2018/05/05(土) 15:07:28.61 .net] すいません。すごく細かいことなんですが、 シェルの変数に関する展開で、 ${somevar:-otherstring} という、somevarに変数が格納されていなればotherstringを変数の値として採用するという仕組みがありますよね。 ここにコマンド展開が使えるということに最近気がつきました。 ${somevar:-$(somecommand)} これは、展開の順序としては I. コマンド展開→変数の展開 somecommandがresultを返し、${somevar:-result}になってresultが展開される のか、 II. 変数の展開→コマンド展開 ${somevar:-$(somecommand)}が$(somecommand)になってresultが返る のか、 どちらか分かりますか? ぶっちゃけ、この違いが影響するような状況に遭遇したことがないのですが、よりよいシェルスクリプトの理解の為にどうかよろしくおねがいします。
1026 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/05(土) 15:36:58.33 .net] IIなんじゃねーの(鼻くそホジホジ)
1027 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/05(土) 23:01:08.19 .net] somecommandを副作用のあるコマンド(touchとかrmとか)にしでsomevarがある状態とない状態でそれぞれどうなるか比べてみればいい。たぶんIIだと思うが。
1028 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/06(日) 01:02:57.40 .net] >>1000 おぉう。そんな手があったとは。勉強になります。 おっしゃる通りIIでした。 somevarに変数が格納されている時、somecommandは実行されませんでした。
1029 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/06(日) 10:46:14.65 .net] echo 999
1030 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/05/06(日) 10:46:54.81 .net] exit 1000
1031 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 411日 22時間 39分 28秒
1032 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています