[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 04/11 08:58 / Filesize : 268 KB / Number-of Response : 1033
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

シェルスクリプト総合 その26



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/

880 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:10:37.31 .net]
export すりゃいいんじゃない

881 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:22:06.60 .net]
こう質問の仕方が下手だと答える気失せるな
変数外に出せばいい

882 名前:セけ []
[ここ壊れてます]

883 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 10:59:32.39 .net]
852だけで良かったのにね

884 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 13:53:42.01 .net]
プログラミング素人っぽいし、加減がわかってないだろうから、
情報が多すぎる方は不問にした方が。
足りないよりは多すぎる方がずっとマシ。

885 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/05(木) 18:12:51.21 .net]
>>856
radiru.sh に引数でタグ情報を渡せばいいと思いますが。

886 名前:名無しさん@お腹いっぱい。 [2018/04/12(木) 09:36:41.69 .net]
bashだと$LINENOでファイルの中での現在の行数が取得できるのですが、
dashやzshだと関数の中にいる時、関数のはじめからの行数になってしまいます。
どうにかして現在の行数を取得する方法はないでしょうか?

887 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 19:02:57.86 .net]
zshよくしらんけど、関数定義の手前の行番号を
変数にでも取っといて足し算すりゃいいんじゃね?

888 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 19:07:33.88 .net]
まぁやりようは如何様にでもあるんだろうが、
ニュアンス的に$LINENO並の手軽さで取得する手段はないかってことじゃね
俺は知らん



889 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 22:14:56.99 .net]
$LINENOってどういう使い方を想定して作ったんだろうね

890 名前:名無しさん@お腹いっぱい。 mailto:sage [2018/04/13(金) 22:51:23.99 .net]
どこを見ればPOSIXシェルスクリプトの確かな仕様に出会えるのか知らないけど、
ググって出てきたこれにはLINENO書いてあるな。
User Portability Utilities optionが必要みたいだけど、なにそれ?
pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html

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 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<268KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef