シェルスクリプトに関する総合スレッドです。
全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。
・「○○(他の言語)でいいやん」は禁止。他のスレに行ってください。
シェルスクリプト総合 その31
https://mevius.5ch.net/test/read.cgi/tech/1565446670/
シェルスクリプト総合 その32
■ このスレッドは過去ログ倉庫に格納されています
2019/10/25(金) 00:08:45.53ID:6btPTvif
647デフォルトの名無しさん
2020/02/17(月) 16:01:09.81ID:qj5C8HtX 入力ファイル形式を
78 hoge hug
805 foo bar
とする。行番号は小さい順に並んでいるものとする。
並んでいないならsortコマンドで並び替えられるのでどうでもいい
あとは、こんな感じのスクリプトを書いて
i=1
while read -r num string; do
while [ $i -lt "$num" ]; do
echo
i=$((i+1))
done
echo $string
i=$((i+1))
done
cat data.txt | script.sh とかすればいい
echoで空行出す所は、seqとかprintf '%s' "$@"とか使えば短くできるだろうな。
78 hoge hug
805 foo bar
とする。行番号は小さい順に並んでいるものとする。
並んでいないならsortコマンドで並び替えられるのでどうでもいい
あとは、こんな感じのスクリプトを書いて
i=1
while read -r num string; do
while [ $i -lt "$num" ]; do
echo
i=$((i+1))
done
echo $string
i=$((i+1))
done
cat data.txt | script.sh とかすればいい
echoで空行出す所は、seqとかprintf '%s' "$@"とか使えば短くできるだろうな。
648デフォルトの名無しさん
2020/02/17(月) 16:15:26.16ID:qj5C8HtX649デフォルトの名無しさん
2020/02/17(月) 16:25:32.91ID:qj5C8HtX 短くしてみた。バグとかはしらん
i=1 num=0
while [ "$i" -le "$num" ] || read -r num string; do
[ "$i" -eq "$num" ] && echo "$string" || echo " "
i=$((i+1))
done
i=1 num=0
while [ "$i" -le "$num" ] || read -r num string; do
[ "$i" -eq "$num" ] && echo "$string" || echo " "
i=$((i+1))
done
650デフォルトの名無しさん
2020/02/17(月) 16:31:22.20ID:2IQo7lRr >>637
どういうことをしたいのかよくわからんが、とりあえずtouchしておけばファイルは作れるんでないの?
どういうことをしたいのかよくわからんが、とりあえずtouchしておけばファイルは作れるんでないの?
651デフォルトの名無しさん
2020/02/17(月) 18:55:51.30ID:P9Oy3OK5 一旦配列に入れてからjoin風に出力
入力はsortされてなくても可
#! /usr/bin/env bash
while read -r num string; do
array[num]="$string"
done
index=( "${!array[@]}" )
for (( i=1; i<=${index[-1]}; i++)); do
if [ -v array["$i"] ];then
echo "${array[$i]}"
else
echo
fi
done
入力はsortされてなくても可
#! /usr/bin/env bash
while read -r num string; do
array[num]="$string"
done
index=( "${!array[@]}" )
for (( i=1; i<=${index[-1]}; i++)); do
if [ -v array["$i"] ];then
echo "${array[$i]}"
else
echo
fi
done
652デフォルトの名無しさん
2020/02/17(月) 21:12:48.06ID:ZjAffcZp >>650
いや,ただたんに新規作成したい訳じゃない…
いや,ただたんに新規作成したい訳じゃない…
653デフォルトの名無しさん
2020/02/18(火) 03:26:33.92ID:enVFBik2 Ruby で作った
以下のコードを、script.rb に保存して、
「ruby script.rb 行番号指定ファイル 入力ファイル」と実行する
ARGV[ 0 ] は、行番号指定ファイル
ARGV[ 1 ] は、入力ファイル
結果は、標準出力に出したので、ファイルへリダイレクトして下さい。
ただし、入力ファイルへはリダイレクトしないように!
行番号指定ファイルは「数字・半角空白・文字列」の順番です。
ただし、行は数字でソートされていること
3 あ い
7 ab
# 行番号指定ファイルを、[ 行番号, 文字列 ] の、2次元配列に読み込む。
# 1行ずつ処理する。末尾の改行を削除する
line_num_ary = File.foreach( ARGV[ 0 ], chomp: true ).with_object( [ ] ) do |line, ary|
tmp_ary = line.split( nil, 2 ) # 空白で、2つに分割する
tmp_ary[ 0 ] = Integer( tmp_ary[ 0 ], 10 ) # 数値型に変換する
ary.push tmp_ary
end
次へ続く
以下のコードを、script.rb に保存して、
「ruby script.rb 行番号指定ファイル 入力ファイル」と実行する
ARGV[ 0 ] は、行番号指定ファイル
ARGV[ 1 ] は、入力ファイル
結果は、標準出力に出したので、ファイルへリダイレクトして下さい。
ただし、入力ファイルへはリダイレクトしないように!
行番号指定ファイルは「数字・半角空白・文字列」の順番です。
ただし、行は数字でソートされていること
3 あ い
7 ab
# 行番号指定ファイルを、[ 行番号, 文字列 ] の、2次元配列に読み込む。
# 1行ずつ処理する。末尾の改行を削除する
line_num_ary = File.foreach( ARGV[ 0 ], chomp: true ).with_object( [ ] ) do |line, ary|
tmp_ary = line.split( nil, 2 ) # 空白で、2つに分割する
tmp_ary[ 0 ] = Integer( tmp_ary[ 0 ], 10 ) # 数値型に変換する
ary.push tmp_ary
end
次へ続く
654653
2020/02/18(火) 03:27:41.15ID:enVFBik2 last_line_num = line_num_ary.last[ 0 ] # 最後の行番号
line_count = nil # ファイルの行数
if FileTest.file? ARGV[ 1 ] # 入力ファイルがあれば
open( ARGV[ 1 ] ) do |f|
while f.gets; end # ファイルを最後まで読む
line_count = f.lineno # ファイルの行数
end
# 最後の行番号の方が、入力ファイルの行数よりも大きい場合は、空行を追加して、同じ行数にする
if last_line_num > line_count
open( ARGV[ 1 ], "a" ) do |f| # 追記
( last_line_num - line_count ).times { f.puts }
end
end
else # 入力ファイルが無ければ、最後の行番号の数だけ、空行を挿入する
open( ARGV[ 1 ], "w" ) do |f| # 書き込み
last_line_num.times { f.puts }
end
end
# 末尾の改行を削除して、配列に読み込む
input_ary = File.readlines( ARGV[ 1 ], chomp: true )
# 行番号で指定された行の、内容を置き換える
line_num_ary.each { |ary| input_ary[ ary[ 0 ] - 1 ] = ary[ 1 ] }
puts input_ary
line_count = nil # ファイルの行数
if FileTest.file? ARGV[ 1 ] # 入力ファイルがあれば
open( ARGV[ 1 ] ) do |f|
while f.gets; end # ファイルを最後まで読む
line_count = f.lineno # ファイルの行数
end
# 最後の行番号の方が、入力ファイルの行数よりも大きい場合は、空行を追加して、同じ行数にする
if last_line_num > line_count
open( ARGV[ 1 ], "a" ) do |f| # 追記
( last_line_num - line_count ).times { f.puts }
end
end
else # 入力ファイルが無ければ、最後の行番号の数だけ、空行を挿入する
open( ARGV[ 1 ], "w" ) do |f| # 書き込み
last_line_num.times { f.puts }
end
end
# 末尾の改行を削除して、配列に読み込む
input_ary = File.readlines( ARGV[ 1 ], chomp: true )
# 行番号で指定された行の、内容を置き換える
line_num_ary.each { |ary| input_ary[ ary[ 0 ] - 1 ] = ary[ 1 ] }
puts input_ary
655デフォルトの名無しさん
2020/02/18(火) 03:35:49.66ID:dYxIHNEw >>649
これが一番だな。短くてbash依存なし。ruby依存なしw
これが一番だな。短くてbash依存なし。ruby依存なしw
656デフォルトの名無しさん
2020/02/18(火) 09:24:28.92ID:2AC9Ct1n いや、それちょっとした文字列操作したくなった時点で相当めんどくさくなるだろ。。
てきとーなスクリプト言語使う方が正解だわ。
シェルで書くことに意固地になってるだけだろ。
てきとーなスクリプト言語使う方が正解だわ。
シェルで書くことに意固地になってるだけだろ。
657デフォルトの名無しさん
2020/02/18(火) 09:30:40.26ID:HqsHcaRa 別にならんだろ。まああれだ、シェル芸しかできなくて
シェルプログラミングできないやつが
ごまかすために言ってるんだろうなと
シェルプログラミングできないやつが
ごまかすために言ってるんだろうなと
658デフォルトの名無しさん
2020/02/18(火) 09:53:00.13ID:2AC9Ct1n あ、普通に馬鹿なんだな。。
もしかしてユニケージの人か?
もしかしてユニケージの人か?
659デフォルトの名無しさん
2020/02/18(火) 10:03:42.59ID:HqsHcaRa ユニケージを見ればわかるが、あれは使い物にならない
特定業務専用のコマンド集でしか無い
そんなことよりさ、自分でコード書けないの?
特定業務専用のコマンド集でしか無い
そんなことよりさ、自分でコード書けないの?
660デフォルトの名無しさん
2020/02/18(火) 10:04:48.16ID:HqsHcaRa 文字列操作の何が面倒なのか知らんが、文字列操作はC言語よりもずっと楽なんだがね。
コマンド呼び出しだけを見れば他のどの言語よりも優れてるし
コマンド呼び出しだけを見れば他のどの言語よりも優れてるし
661デフォルトの名無しさん
2020/02/18(火) 10:42:09.68ID:X2bVDQHa > てきとーなスクリプト言語
シェルスクリプトとか?w
シェルスクリプトとか?w
662デフォルトの名無しさん
2020/02/18(火) 14:37:02.43ID:gCN/+gaX >>660
ていうか実はシェルスクリプトって
PythonでいうC API的なものの嚆矢であり最前線なんだよね。
C言語の標準入出力・ファイル読出/書込をシェルでやって
数値計算とかバイナリ解析とかそういう部分はC言語でコマンド作って任せるっていう。
ていうか実はシェルスクリプトって
PythonでいうC API的なものの嚆矢であり最前線なんだよね。
C言語の標準入出力・ファイル読出/書込をシェルでやって
数値計算とかバイナリ解析とかそういう部分はC言語でコマンド作って任せるっていう。
663デフォルトの名無しさん
2020/02/18(火) 15:45:01.04ID:fdBjlYYo IT系の仕事してるけどアプリ作ってるときはコンパイルは普通だった
でもインフラの仕事をするとシェルスクリプト多数だった
シェルスクリプト作ってる人たちはコンパイルの概念が分からないらしかった
プログラムはビルドしてリリースしてとソースと実行ファイルの管理が面倒だけど
シェルスクリプトって即物的なのがいい
でもインフラの仕事をするとシェルスクリプト多数だった
シェルスクリプト作ってる人たちはコンパイルの概念が分からないらしかった
プログラムはビルドしてリリースしてとソースと実行ファイルの管理が面倒だけど
シェルスクリプトって即物的なのがいい
664デフォルトの名無しさん
2020/02/18(火) 17:27:39.45ID:X8dqmLc9 1 2
3 4
みたいなhoge.txtがあって
cat hoge.txt | sed "s/\t/,/g" > piyo.csv
ってやってもhogeのままなんですけど
cat hoge.txt | tr " \t" "," > piyo.csv
ってやると上手くいきました、mac環境なんですけど
何が原因なのか分かりません…
sedの置換対象に数字を入れた場合は上手くいきました
3 4
みたいなhoge.txtがあって
cat hoge.txt | sed "s/\t/,/g" > piyo.csv
ってやってもhogeのままなんですけど
cat hoge.txt | tr " \t" "," > piyo.csv
ってやると上手くいきました、mac環境なんですけど
何が原因なのか分かりません…
sedの置換対象に数字を入れた場合は上手くいきました
665デフォルトの名無しさん
2020/02/18(火) 17:30:18.44ID:hjlsDnk2 1 と 2 の間にあるのがスペースなんじゃ…
666デフォルトの名無しさん
2020/02/18(火) 20:22:18.38ID:wp4bvOJX667デフォルトの名無しさん
2020/02/18(火) 20:27:51.93ID:VB0SzzBs >>664
mac の sed は \t をタブ文字として扱わないらしいね
https://stackoverflow.com/questions/5398395/how-can-i-insert-a-tab-character-with-sed-on-os-x/5398453#5398453
sed "s/$(printf '\t')/,/g" はどうかな
printf も \t 非対応なんてことはさすがに無いと思うけど
mac の sed は \t をタブ文字として扱わないらしいね
https://stackoverflow.com/questions/5398395/how-can-i-insert-a-tab-character-with-sed-on-os-x/5398453#5398453
sed "s/$(printf '\t')/,/g" はどうかな
printf も \t 非対応なんてことはさすがに無いと思うけど
668デフォルトの名無しさん
2020/02/18(火) 20:33:06.70ID:hjlsDnk2 tr " \t" "," となっていてスペースが含まれているから
上手くいっているんじゃないかと
上手くいっているんじゃないかと
669デフォルトの名無しさん
2020/02/18(火) 21:52:28.55ID:8C0JMYsF 665~668の方まで皆さんありがとうございます
とりあえず痴漢の成功例を○、上手くいかなかったのを×として
× tr " " ","
○ tr "\t" ","
× sed "s/\t/,/g" (\tを\\tに変える、クオーテーションを変えるなどしても同様)
○ sed "s/$(printf '\t')/,/g"
という感じでした。
macとlinuxでオプション違うのは経験で知ってたんですが正規表現にまで
関わってくるんですね…良い事を教えていただいてありがとうございます。
とりあえず痴漢の成功例を○、上手くいかなかったのを×として
× tr " " ","
○ tr "\t" ","
× sed "s/\t/,/g" (\tを\\tに変える、クオーテーションを変えるなどしても同様)
○ sed "s/$(printf '\t')/,/g"
という感じでした。
macとlinuxでオプション違うのは経験で知ってたんですが正規表現にまで
関わってくるんですね…良い事を教えていただいてありがとうございます。
670デフォルトの名無しさん
2020/02/18(火) 22:18:45.81ID:ObTpNy6/ macならgnu-sedをインストールしてそっち使ったほうが良い
671デフォルトの名無しさん
2020/02/19(水) 11:18:51.97ID:nP6c4IYT 痴漢の成功例っていやだなw
672デフォルトの名無しさん
2020/02/19(水) 12:03:18.50ID:pMNWrift 気が付かなかったww
673デフォルトの名無しさん
2020/02/21(金) 06:21:58.42ID:A/822pua $ ed -s <(seq 3) <<< $'3m1\n,p'
1
3
2
$ ed -s <(seq 3) <<< '3m1\n,p'
?
これでコマンドラインからedが使えるけどこの$ってどんな効果が?
付けないとこの通り表示されないし
1
3
2
$ ed -s <(seq 3) <<< '3m1\n,p'
?
これでコマンドラインからedが使えるけどこの$ってどんな効果が?
付けないとこの通り表示されないし
674デフォルトの名無しさん
2020/02/21(金) 07:58:16.90ID:0dzJ+7kH675デフォルトの名無しさん
2020/02/21(金) 14:48:04.29ID:A/822pua676デフォルトの名無しさん
2020/02/22(土) 16:39:03.63ID:C/dFKPoq kshのリポジトリのmasterが3400ぐらいあったコミットが13に減っていてワロタw
677デフォルトの名無しさん
2020/02/25(火) 12:18:34.54ID:S19Y4jrS grepの-eオプションみたく複数回指定できるオプション引数って
シェルスクリプトでどうやって処理するのが一般的なんかな。
getopts(1)の例
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html#tag_20_54_17
とかに載ってるような引数付き-bオプションに対して変数bflag=1, bval="$OPTARG"にする方法だと
最後に出現した-b XXXしか感知できないよね。
-b XX1 -b XX2 -b XX3
↑こういうコマンドライン引数があったときに-bオプションに対する引数を全部認識するようにしたい。
そういう処理をしているスクリプトのソースへのリンクとか教えてもらえるとすごく助かる。
シェルスクリプトでどうやって処理するのが一般的なんかな。
getopts(1)の例
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/getopts.html#tag_20_54_17
とかに載ってるような引数付き-bオプションに対して変数bflag=1, bval="$OPTARG"にする方法だと
最後に出現した-b XXXしか感知できないよね。
-b XX1 -b XX2 -b XX3
↑こういうコマンドライン引数があったときに-bオプションに対する引数を全部認識するようにしたい。
そういう処理をしているスクリプトのソースへのリンクとか教えてもらえるとすごく助かる。
678デフォルトの名無しさん
2020/02/25(火) 12:53:16.03ID:5KSIeSvf 出現するたびになにかやればいいだけじゃん
679デフォルトの名無しさん
2020/02/25(火) 14:13:23.37ID:oSeHo6cg >>677
一般的かどうか知らないけど配列に入れて要素の数だけループさせてる
別のコマンドに渡すことが大半なのでループ内ではコマンド文字列を生成して実行はループの外でやる
while getopts “e:” opt; do
case "$opt" in
“e”) strings+=("$OPTARG");;
esac
done
shift $(($OPTIND - 1))
for value in "${strings[@]}"; do
…
done
一般的かどうか知らないけど配列に入れて要素の数だけループさせてる
別のコマンドに渡すことが大半なのでループ内ではコマンド文字列を生成して実行はループの外でやる
while getopts “e:” opt; do
case "$opt" in
“e”) strings+=("$OPTARG");;
esac
done
shift $(($OPTIND - 1))
for value in "${strings[@]}"; do
…
done
680デフォルトの名無しさん
2020/02/25(火) 15:00:07.73ID:mMwfySZI bash依存は甘え
681デフォルトの名無しさん
2020/02/25(火) 15:30:00.20ID:K+FIgRaj682デフォルトの名無しさん
2020/02/25(火) 15:45:41.88ID:K+FIgRaj 今更だけど、試しにNetBSDのgrepのソースコードを覗いてみたら、pattern[]配列に格納してたわ。
POSIXシェルみたいな配列に対応してないシェルでも0x1Fユニット区切り文字とか使えばいいかな。
POSIXシェルみたいな配列に対応してないシェルでも0x1Fユニット区切り文字とか使えばいいかな。
683デフォルトの名無しさん
2020/02/25(火) 17:02:15.34ID:eOOTHTW4 全てのシェルに配列はあるだろ? $@を使えばいいんだよ
あとはqiitaででも探せ。答えはそこにある。
あとはqiitaででも探せ。答えはそこにある。
684デフォルトの名無しさん
2020/02/25(火) 17:24:31.11ID:S19Y4jrS685デフォルトの名無しさん
2020/02/25(火) 17:25:41.11ID:S19Y4jrS サブシェルで処理すれば$@は引き継がれないから影響ないけど
そうすると今度は肝心要の、現在処理しているコマンドライン引数を全く参照できなくなる。
そうすると今度は肝心要の、現在処理しているコマンドライン引数を全く参照できなくなる。
686デフォルトの名無しさん
2020/02/25(火) 17:46:16.45ID:eOOTHTW4 サブシェルなんかいらねーだろ
関数使えよ
関数使えよ
687デフォルトの名無しさん
2020/02/25(火) 22:33:40.09ID:S19Y4jrS >>686
頭悪くて恥ずかしい限りだが、
スクリプトの例を書いてもらえないか。
excmd -a XXX -a YYY -a ZZZ
みたいなコマンドライン引数を解釈して、
全部読み切った後に-aオプションに対するオプション引数をそれぞれ取得できるっていう。
全部読み切った後ってのは、getoptやらで最後のオプションまで読み切って、
引数関連のエラーがないことを確かめてからってことね。
「-aオプションの出現を感知するたびに標準出力に出す」みたいなのじゃなく。
頭悪くて恥ずかしい限りだが、
スクリプトの例を書いてもらえないか。
excmd -a XXX -a YYY -a ZZZ
みたいなコマンドライン引数を解釈して、
全部読み切った後に-aオプションに対するオプション引数をそれぞれ取得できるっていう。
全部読み切った後ってのは、getoptやらで最後のオプションまで読み切って、
引数関連のエラーがないことを確かめてからってことね。
「-aオプションの出現を感知するたびに標準出力に出す」みたいなのじゃなく。
688デフォルトの名無しさん
2020/02/25(火) 22:48:26.39ID:8Uixj76j689デフォルトの名無しさん
2020/02/26(水) 08:09:52.20ID:vrfGqddo >>688
?
-aの位置の次にある引数を取得するってこと?
でもそうすると
-bcaXXX
↑こういうときはどう解析するの?(-b,-cは引数を取らないオプション)
この形式のオプションもPOSIXでは許可されてるから
当然解析できなければならないけど。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
?
-aの位置の次にある引数を取得するってこと?
でもそうすると
-bcaXXX
↑こういうときはどう解析するの?(-b,-cは引数を取らないオプション)
この形式のオプションもPOSIXでは許可されてるから
当然解析できなければならないけど。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
690デフォルトの名無しさん
2020/02/26(水) 08:25:40.38ID:iwwM4ZEx >>689
引数処理にこだわり始めるとスクリプト実行して引数解析終わるまで時間がかかるようになって
使い物にならなくなるので複雑な記法は全部捨てたわ
POSIXで許可されているから実装しなきゃならないというならPOSIXを窓から投げ捨てるべき
引数処理にこだわり始めるとスクリプト実行して引数解析終わるまで時間がかかるようになって
使い物にならなくなるので複雑な記法は全部捨てたわ
POSIXで許可されているから実装しなきゃならないというならPOSIXを窓から投げ捨てるべき
691デフォルトの名無しさん
2020/02/26(水) 08:29:52.36ID:kXv4PxDr692デフォルトの名無しさん
2020/02/26(水) 09:28:16.44ID:9H3dDcdo bash によるオプション解析 - Qiita
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
getoptsの存在すら知らずに横着して=~を使ってすまんな
オプションの集約ってこうも面倒だったのね
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
getoptsの存在すら知らずに横着して=~を使ってすまんな
オプションの集約ってこうも面倒だったのね
693デフォルトの名無しさん
2020/02/26(水) 09:48:23.19ID:re2OdmIW timeoutで終了するプログラムの最後の1行だけを表示させたいどうするの?
694デフォルトの名無しさん
2020/02/26(水) 09:54:37.39ID:kXv4PxDr >>692
どの言語にもオプション解析用のライブラリがある理由が分かったろ?
どの言語にもオプション解析用のライブラリがある理由が分かったろ?
695デフォルトの名無しさん
2020/02/26(水) 11:26:08.87ID:vrfGqddo ちなみにgetoptsコマンドはPOSIXで定義されてるけど,実はPOSIXが定めるオプション書式に対応していないっていう。
まあOpenGroup側も「任意のオプション引数は歴史的な理由以外で使ってはならない」って言ってる訳だし
仕方無い部分もあるけど。
一方で複数回登場する引数付きオプションは,ちゃんと現行のアプリケーションでの使用も許可されているにもかかわらず
getopts自身はそういうオプションに対する便利な機能をなんら提供してない。
まあOpenGroup側も「任意のオプション引数は歴史的な理由以外で使ってはならない」って言ってる訳だし
仕方無い部分もあるけど。
一方で複数回登場する引数付きオプションは,ちゃんと現行のアプリケーションでの使用も許可されているにもかかわらず
getopts自身はそういうオプションに対する便利な機能をなんら提供してない。
696デフォルトの名無しさん
2020/02/26(水) 13:10:48.18ID:iFRpldfA >>695
任意のオプション引数ってどういうもののことを言ってる?
任意のオプション引数ってどういうもののことを言ってる?
697デフォルトの名無しさん
2020/02/26(水) 13:41:46.61ID:vrfGqddo >>696
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
ここを読め…と突き放すのはあんまりなんで説明すると
“optional option-argument”---任意のオプション引数っていうのは,
当該オプションのあとにそのオプションに対する(一つの)引数が指定されてもされなくてもいいような
オプションのこと。
manページの「書式」節で
somecmd -o[arg]
みたいに書かれている場合が該当する。
これは
somecmd -o
の時は「オプション-oが引数なしで指定された」と解釈し
somecmd -oXXX
の時は「オプション-oが引数XXXで指定された」と解釈,
somecmd -o XXX
のときは「オプション-oと,(それとは直接関係ない)被演算子XXXが指定された」と解釈する
という決まりになってる。
なおPOSIXでは規程されてないけど,長いオプションの場合は
任意のオプション引数を指定したければオプションとオプション引数を=で結ぶのが通例みたい。
--long-opt=XXX
↑こういう感じ。
https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap12.html
ここを読め…と突き放すのはあんまりなんで説明すると
“optional option-argument”---任意のオプション引数っていうのは,
当該オプションのあとにそのオプションに対する(一つの)引数が指定されてもされなくてもいいような
オプションのこと。
manページの「書式」節で
somecmd -o[arg]
みたいに書かれている場合が該当する。
これは
somecmd -o
の時は「オプション-oが引数なしで指定された」と解釈し
somecmd -oXXX
の時は「オプション-oが引数XXXで指定された」と解釈,
somecmd -o XXX
のときは「オプション-oと,(それとは直接関係ない)被演算子XXXが指定された」と解釈する
という決まりになってる。
なおPOSIXでは規程されてないけど,長いオプションの場合は
任意のオプション引数を指定したければオプションとオプション引数を=で結ぶのが通例みたい。
--long-opt=XXX
↑こういう感じ。
698デフォルトの名無しさん
2020/02/26(水) 13:46:00.81ID:Z7ha8duC >>697
ああ、OKOK、ちゃんと分かってるね
ああ、OKOK、ちゃんと分かってるね
699デフォルトの名無しさん
2020/02/26(水) 15:55:24.01ID:vrfGqddo >>698
分かってもらえたみたいでよかった。
分かってもらえたみたいでよかった。
700デフォルトの名無しさん
2020/02/26(水) 23:24:46.41ID:iwwM4ZEx >>691
使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...
個人的には -help が --help の書き間違いとして拾ってくれずに -h -e -l -p になるのが気に食わんのですよ
使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...
個人的には -help が --help の書き間違いとして拾ってくれずに -h -e -l -p になるのが気に食わんのですよ
701デフォルトの名無しさん
2020/02/27(木) 00:12:01.62ID:nCyLO+2A Ruby の、OptionParser では、
require 'optparse'
ARGV.replace %w(-e abc -e あ)
opts = { }
ARGV.options do |o|
o.on( "-e パターン", "絞り込む" ) { |x|
( opts[ :pattern ] ||= [ ] ).push x } # 配列に追加する
o.parse!
end
p opts #=> { :pattern=>["abc", "あ"] }
require 'optparse'
ARGV.replace %w(-e abc -e あ)
opts = { }
ARGV.options do |o|
o.on( "-e パターン", "絞り込む" ) { |x|
( opts[ :pattern ] ||= [ ] ).push x } # 配列に追加する
o.parse!
end
p opts #=> { :pattern=>["abc", "あ"] }
702デフォルトの名無しさん
2020/02/27(木) 01:10:41.62ID:WuLbJO/f >>700
その一文字オプションの連結に対応しなければいいだけじゃん
その一文字オプションの連結に対応しなければいいだけじゃん
703デフォルトの名無しさん
2020/02/27(木) 10:15:09.64ID:1d0gnp8c704700
2020/02/28(金) 00:12:31.43ID:sbmuwMBZ706デフォルトの名無しさん
2020/02/28(金) 21:07:42.16ID:11SJpN8G > 個人的には -help が --help の書き間違いとして拾ってくれずに
-help が --help の書き間違いとして拾ってくれるものなんてある?
-help が --help の書き間違いとして拾ってくれるものなんてある?
707デフォルトの名無しさん
2020/02/28(金) 21:16:46.81ID:9ZnEM/be >>700
> 使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...
外部コマンドを使うと遅くなって使い物にならないから、
外部コマンドなし縛りで自分でパーサーを実装すればいいだけ。
それができないから「下手すぎw」と言ってるわけです。
まあ自分で作れないなら仕方ないけどw
> 使い物にならんから外部コマンドなし縛りにして、その結果複雑な書き方捨てたって事なんですが...
外部コマンドを使うと遅くなって使い物にならないから、
外部コマンドなし縛りで自分でパーサーを実装すればいいだけ。
それができないから「下手すぎw」と言ってるわけです。
まあ自分で作れないなら仕方ないけどw
708デフォルトの名無しさん
2020/02/29(土) 08:02:48.75ID:A8pIm3Di うわぁー
709デフォルトの名無しさん
2020/02/29(土) 08:10:25.23ID:wnu08hYu 外部コマンドを使おうが使うまいが、パーサーのアルゴリズムに大差ないだろ?
今まで外部コマンドを使ってパースしてたなら、
それを外部コマンドを使わずにパースするだけじゃん
何が難しいというのか?
今まで外部コマンドを使ってパースしてたなら、
それを外部コマンドを使わずにパースするだけじゃん
何が難しいというのか?
710700
2020/02/29(土) 09:04:49.63ID:toFJGN/1711デフォルトの名無しさん
2020/02/29(土) 09:27:10.60ID:Z90YN+Q9712デフォルトの名無しさん
2020/02/29(土) 13:13:04.89ID:IP0SEm6N なんか、車輪の再発明みたいなことになってるなw
713デフォルトの名無しさん
2020/02/29(土) 14:05:54.81ID:MM7sekhX getoptが使い物にならないんだから
作らないとしょうがない
作らないとしょうがない
714デフォルトの名無しさん
2020/03/01(日) 11:37:30.39ID:4tQoD8Fw × getopt
○ getopts
○ getopts
715デフォルトの名無しさん
2020/03/01(日) 12:51:34.60ID:4c8klxdl シェルスクリプト用のオプションパーサーって無いの?getopt/getopts以外で
716デフォルトの名無しさん
2020/03/01(日) 12:56:04.13ID:4tQoD8Fw717デフォルトの名無しさん
2020/03/01(日) 13:09:15.84ID:4c8klxdl >>716
それはgo製じゃん
それはgo製じゃん
718デフォルトの名無しさん
2020/03/01(日) 13:11:39.38ID:TiMroEot > docopts : the command line wrapper for bash.
719デフォルトの名無しさん
2020/03/01(日) 13:16:40.87ID:4c8klxdl bashってのもマイナス点だな
720デフォルトの名無しさん
2020/03/01(日) 14:02:23.94ID:4tQoD8Fw >>717
シェルスクリプト用のあれこれはすべてシェルスクリプト製じゃないといけない
なんて思ってないよな?
俺の知っているシェル・OS環境は,
sortやgrepみたいな外部コマンドどころか for文や変数処理みたいなシェルの内部動作も
みんなC言語で書かれてるんだが…
シェルスクリプト用のあれこれはすべてシェルスクリプト製じゃないといけない
なんて思ってないよな?
俺の知っているシェル・OS環境は,
sortやgrepみたいな外部コマンドどころか for文や変数処理みたいなシェルの内部動作も
みんなC言語で書かれてるんだが…
721デフォルトの名無しさん
2020/03/01(日) 14:28:49.88ID:4c8klxdl シェルスクリプト製じゃないと、1つのファイルに出来ないじゃん
722デフォルトの名無しさん
2020/03/01(日) 15:29:04.21ID:4tQoD8Fw × シェルスクリプト用のオプションパーサー
○ シェルスクリプト製のオプションパーサー
質問するときは明確な言葉で。
○ シェルスクリプト製のオプションパーサー
質問するときは明確な言葉で。
723デフォルトの名無しさん
2020/03/01(日) 16:13:34.61ID:DvIm3g7W ID:4c8klxdlの無能さ
724デフォルトの名無しさん
2020/03/02(月) 16:01:50.45ID:s5dtAso/ 外部コマンド使いなくないならBusyBoxみたいなの使うしかないよな。
725デフォルトの名無しさん
2020/03/02(月) 16:35:15.54ID:+7p1D0tE ビルトインコマンドでいいじゃん
726デフォルトの名無しさん
2020/03/02(月) 23:40:28.80ID:8PHDRupm -help が --help の書き間違いには、ならない。
-help は、h,e,l,p のオプションを連結した書き方で、文法的に正しいから
だから、オプションの連結を禁止すればよい
そうすれば、-h, -e, -l, -p みたいに、書かないといけないから、
-help は、絶対に間違いになるから、指摘できる
オプションの連結は、情報処理の教育を受けた社員を想定しているから、
勉強していないような素人には、難しすぎるw
-help は、h,e,l,p のオプションを連結した書き方で、文法的に正しいから
だから、オプションの連結を禁止すればよい
そうすれば、-h, -e, -l, -p みたいに、書かないといけないから、
-help は、絶対に間違いになるから、指摘できる
オプションの連結は、情報処理の教育を受けた社員を想定しているから、
勉強していないような素人には、難しすぎるw
727デフォルトの名無しさん
2020/03/03(火) 07:08:07.59ID:IKAJxND7 根本は中国人なのにマスコミも政府も絶対言わないし、
制限しない。
311の政府対応と同じ
政権変わっても変わらん
制限しない。
311の政府対応と同じ
政権変わっても変わらん
728デフォルトの名無しさん
2020/03/03(火) 07:53:58.76ID:4u1zxYLS 誤爆するガイキチ
729デフォルトの名無しさん
2020/03/03(火) 09:24:57.55ID:MNbayHdo >>726
情報処理の教育を受けた社員しか想定していないので問題ない
情報処理の教育を受けた社員しか想定していないので問題ない
730デフォルトの名無しさん
2020/03/03(火) 10:15:38.32ID:l2g6jfLd あとは自力で勉強探究心があるギーク向けだしな
731デフォルトの名無しさん
2020/03/03(火) 10:44:21.85ID:z64lrdXB find「せやな」
732デフォルトの名無しさん
2020/03/03(火) 12:18:09.49ID:3ukr+OhM 任意のオプション引数ってさ、
-help が -h elp って解釈されるよね?
-h -e -l -p とどうやって区別するの?
-help って書いた時どっちの意味になるの?
-help が -h elp って解釈されるよね?
-h -e -l -p とどうやって区別するの?
-help って書いた時どっちの意味になるの?
733デフォルトの名無しさん
2020/03/03(火) 12:32:47.35ID:yHaKKNdM あるスクリプトを作っていて、gitで管理しています。
~/src ← gitで管理
~/src/script.sh ← あるスクリプト
~/src/inc.sh ← あるスクリプトから読み込むライブラリ
script.sh から inc.sh を読み込むときに、
. ./inc.sh と書いています
script.sh をどのディレクトリからでも実行できるように
~/bin ディレクトリにシンボリックリンクを作成しました。
そして実行するとエラーになりました。
~/bin/inc.sh を読み込もうとしているからだと思いますが
いい解決方法はないでしょうか?
~/src ← gitで管理
~/src/script.sh ← あるスクリプト
~/src/inc.sh ← あるスクリプトから読み込むライブラリ
script.sh から inc.sh を読み込むときに、
. ./inc.sh と書いています
script.sh をどのディレクトリからでも実行できるように
~/bin ディレクトリにシンボリックリンクを作成しました。
そして実行するとエラーになりました。
~/bin/inc.sh を読み込もうとしているからだと思いますが
いい解決方法はないでしょうか?
734デフォルトの名無しさん
2020/03/03(火) 14:02:09.02ID:5O39EjRd735デフォルトの名無しさん
2020/03/03(火) 14:06:21.11ID:yHaKKNdM >>734
いろいろあって、そこはシンボリックじゃないとだめなんですよ
いろいろあって、そこはシンボリックじゃないとだめなんですよ
736デフォルトの名無しさん
2020/03/03(火) 17:07:25.01ID:FfxSBx1I737デフォルトの名無しさん
2020/03/03(火) 17:55:54.44ID:n9Ghdw3q >>733
inc.shも~/bin(や特定固定のとこ)にシンボリックリンクを置いてしまえ
とか
pathme="$(which "$0")";
[ -L "$pathme" ] && pathme="$(readlink "$pathme")"
. "$(dirname "$pathme")/inc.sh"
とか
inc.shも~/bin(や特定固定のとこ)にシンボリックリンクを置いてしまえ
とか
pathme="$(which "$0")";
[ -L "$pathme" ] && pathme="$(readlink "$pathme")"
. "$(dirname "$pathme")/inc.sh"
とか
738デフォルトの名無しさん
2020/03/03(火) 18:16:56.75ID:n9Ghdw3q >>733
>~/bin/inc.sh を読み込もうとしているからだと思いますが
./inc.sh とかいう相対パスは現在のワーキングディレクトリ/カレントディレクトリからのだよ。sourceも同じく特殊なことはせずに
"$(pwd)/inc.sh" を読み込もうとしているのだろう
>~/bin/inc.sh を読み込もうとしているからだと思いますが
./inc.sh とかいう相対パスは現在のワーキングディレクトリ/カレントディレクトリからのだよ。sourceも同じく特殊なことはせずに
"$(pwd)/inc.sh" を読み込もうとしているのだろう
739デフォルトの名無しさん
2020/03/03(火) 19:32:36.52ID:PcLjcySC >>737
やっぱりreadlink使うしか無いですかね。
シンボリックのシンボリックのシンボリックとか考慮すると
readlink -fが必要になるけど、macOS版だとgreadlinkじゃないと動かないし
そもそもgreadlinkが入ってないとか、その他のOSではどうなるの?とか。
そういう面倒なコードはライブラリにしたいけど、そのライブラリを読み込むのに苦労するというw
やっぱりreadlink使うしか無いですかね。
シンボリックのシンボリックのシンボリックとか考慮すると
readlink -fが必要になるけど、macOS版だとgreadlinkじゃないと動かないし
そもそもgreadlinkが入ってないとか、その他のOSではどうなるの?とか。
そういう面倒なコードはライブラリにしたいけど、そのライブラリを読み込むのに苦労するというw
740デフォルトの名無しさん
2020/03/03(火) 19:58:06.90ID:BC6YzT5m 後出しかよ
シンボリックのシンボリックのシンボリック
なら、三行書けばいいだけじゃん
やっぱりって何がやっぱりなんだか
シンボリックのシンボリックのシンボリック
なら、三行書けばいいだけじゃん
やっぱりって何がやっぱりなんだか
741デフォルトの名無しさん
2020/03/03(火) 20:06:11.93ID:BC6YzT5m pathme="$(command -v "$0")" || pathme="$0"
[ "$pathme" = "" ] && pathme="$0"
while [ -L "$pathme" ]; do
pathme="$(readlink "$pathme")"
done
. "$(dirname "$pathme")/inc.sh"
で、いいんじゃねえのかよぉ?なんでこんな簡単な対処も?と思うのでなんか穴があるか???
whichってPOSIXじゃなかったのね。煩そうだからそこも
[ "$pathme" = "" ] && pathme="$0"
while [ -L "$pathme" ]; do
pathme="$(readlink "$pathme")"
done
. "$(dirname "$pathme")/inc.sh"
で、いいんじゃねえのかよぉ?なんでこんな簡単な対処も?と思うのでなんか穴があるか???
whichってPOSIXじゃなかったのね。煩そうだからそこも
742デフォルトの名無しさん
2020/03/03(火) 20:07:32.72ID:BC6YzT5m あ、二行目はいらない。もしくは一行目の||の後ろ
743デフォルトの名無しさん
2020/03/03(火) 20:41:22.45ID:Lk6RorVj744デフォルトの名無しさん
2020/03/03(火) 20:47:57.53ID:BC6YzT5m なんかぐちぐち言っているけど、そんなこと対処すぐ自分でできるでしょなことをぐちぐちとという
ぐちぐち言う奴にはリアルでもムカつく沸点は低いのは確かだがなw
それと後出しなら当然のようにではなくて、すまんがが先にありがだろうに、何を当たり前のようにというのだな。リアルでもねw
ぐちぐち言う奴にはリアルでもムカつく沸点は低いのは確かだがなw
それと後出しなら当然のようにではなくて、すまんがが先にありがだろうに、何を当たり前のようにというのだな。リアルでもねw
745デフォルトの名無しさん
2020/03/03(火) 20:55:19.44ID:dHOuVCIc 意訳 謝罪しろ
746デフォルトの名無しさん
2020/03/03(火) 20:57:44.45ID:BC6YzT5m そう読めるなら、沸点は俺より低すぎだな
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「脅迫だ」国分太一に同情論 音声データ削除要求など日テレの対応を疑問視する声ネットに噴出「それこそコンプラ違反では」 [muffin★]
- 中国と対話で良い関係つくるのが責任と首相 ★4 [少考さん★]
- 【国際法を無視】日本での「中華人民共和国に台湾問題を論じる資格なし」との声に 中国外交部が厳しく反論… [BFU★]
- 生クリームだけの真っ白なクリスマスケーキ 大手メーカーが販売、その理由は…フルーツなしで価格は半額以下に ★3 [おっさん友の会★]
- 〈シカが泣いている…〉奈良が“観光崩壊”危機…外国人観光客は44.5万人、宿泊客単価は3万1千円 [1ゲットロボ★]
- 【学術団体】高市総理の台湾有事に関する発言を巡り、学者らが日中関係修復を求める緊急声明を発表… ★2 [BFU★]
- チンピラ、半グレ、反社、次々と愛国ビジネスで稼ぎ始める…戦後の暴力団右翼の復活か [165981677]
- 【速報】被害者に日本人はいませんでした [377482965]
- 【実況】博衣こよりのえちえちSSholox4周年切り抜き鑑賞🧪★3
- 高市ネトウヨ「中国シナ人は滅びろ!」(中国製スマホ、服、生活品を使いながら)→これ外国人笑うらしいなw [153490809]
- 高市のせいでこれから国際会議で台湾を「中国台北」と呼称しないと行けなくなってしまった模様 [709039863]
- 【悲報】野田佳彦、高市さんの『存立危機事態』答弁を撤回 [519511584]
