シェルスクリプトの総合スレです。
□お約束
・特記なき場合はBourne Shell(/bin/sh)もしくはPOSIX準拠の互換シェルがデフォルトです。
bash/zsh/ksh/ash/dash/yash/poshなどの専用機能に依存する場合は明示しましょう。
Linuxユーザは/bin/shの正体がbashまたはdashなので特に注意。
FreeBSDユーザは/bin/shの正体がashなので注意。
・POSIXについてのリンクは https://en.wikipedia.org/wiki/POSIX にまとめられています
最新の仕様はこちらへ http://pubs.opengroup.org/onlinepubs/9699919799/
(左上の「Shell & Utilities」 から参照することができます。)
・v7 shに一番近くて、現役(?)のshは、OpenSolaris由来のheirloom sh。
http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/sh/
http://heirloom.sourceforge.net/sh.html
・csh/tcshのシェルスクリプトは推奨されません。
(理由は「csh-whynot」でググれ)
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります。
manや参考リンクを見ましょう。
aproposないしはman -kでそれらしい単語による簡単な検索もできます。
・シェルで使えるワイルドカード等は正規表現ではありません。
正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
□初心者へのアドバイス:
・適した道具を判断するのも頭の重要な使い方。シェルスクリプトよりも
awkまたはperlの方が適した処理にはそちらを使いましょう。
・知らないコマンドが出てきたらmanを引きましょう。
・思い通りに動かないときは、まずは sh -x でトレースしましょう。
□回答者への注意事項:
・シェルスクリプトでの処理方法を質問しているのに、よくわからずに
「そういうのはperl使いましょう」と回答するのはやめましょう。
安易にperlに逃げずにシェルスクリプトで処理するのが頭のいいやり方。
質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
前スレ シェルスクリプト総合 その26
https://mevius.5ch.net/test/read.cgi/unix/1489979246/
探検
シェルスクリプト総合 その27
■ このスレッドは過去ログ倉庫に格納されています
2018/05/03(木) 17:54:23.25
2018/06/06(水) 09:02:34.23
aaa=(888 犬 `date +"%Y%m%d"010000 -d last-sunday`)
bbb=(777 猫 `date +"%Y%m%d"150000 -d last-Saturday`)
ccc=(666 鳥 `date +"%Y%m%d"000000 -d last-friday`)
for hoge in "$aaa" "$bbb" "$ccc"
do
if [ -e ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/${hoge[2]}-${hoge[0]}.aac ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4
fi
done
こんな感じのスクリプト書いたのですが、配列が展開してくれません。
どうすれば変数に入れた配列が機能するでしょうか
アドバイスお願いします。
bbb=(777 猫 `date +"%Y%m%d"150000 -d last-Saturday`)
ccc=(666 鳥 `date +"%Y%m%d"000000 -d last-friday`)
for hoge in "$aaa" "$bbb" "$ccc"
do
if [ -e ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/${hoge[2]}-${hoge[0]}.aac ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4
fi
done
こんな感じのスクリプト書いたのですが、配列が展開してくれません。
どうすれば変数に入れた配列が機能するでしょうか
アドバイスお願いします。
2018/06/06(水) 09:51:21.96
2018/06/06(水) 09:51:56.75
>>212
配列はbash専用機能なので使うな
配列はbash専用機能なので使うな
2018/06/06(水) 13:07:10.63
2018/06/06(水) 13:12:22.57
なんだかんだレスに飢えてるよね
2018/06/06(水) 13:23:12.77
やりたいこと想像してベタにやってみたけど
printf "%s %s %s\n" ${aaa[@]} ${bbb[@]} ${ccc[@]} | while read hoge0 hoge1 hoge2; do
if [ -e ~/${hoge1}_${hoge2:0:4}_${hoge2:4:2}_${hoge2:6:2}.mp4 ]; then
exit 0
else
ffmpeg -nostdin -i ~/output/${hoge2}-${hoge0}.aac ~/${hoge1}_${hoge2:0:4}_${hoge2:4:2}_${hoge2:6:2}.mp4
fi
done
...て、ほぼ配列じゃなくなっちゃったは
printf "%s %s %s\n" ${aaa[@]} ${bbb[@]} ${ccc[@]} | while read hoge0 hoge1 hoge2; do
if [ -e ~/${hoge1}_${hoge2:0:4}_${hoge2:4:2}_${hoge2:6:2}.mp4 ]; then
exit 0
else
ffmpeg -nostdin -i ~/output/${hoge2}-${hoge0}.aac ~/${hoge1}_${hoge2:0:4}_${hoge2:4:2}_${hoge2:6:2}.mp4
fi
done
...て、ほぼ配列じゃなくなっちゃったは
2018/06/06(水) 13:55:28.85
2018/06/06(水) 14:36:06.61
よくいる偉そうにしたいのが主な目的なのがわいてる感じ
2018/06/06(水) 14:45:44.90
そういう言葉でしか言い返せないのな
悔しかったら技術で勝負しろ
悔しかったら技術で勝負しろ
2018/06/06(水) 14:49:07.49
どこに勝負要素があるのか分からない
しかし最近汚いコードがばらっと貼り付けられまくるのは同一人物なのか?
しかし最近汚いコードがばらっと貼り付けられまくるのは同一人物なのか?
2018/06/06(水) 14:51:48.88
身に覚えがなかったら勝負とか言わないよなあ。てか、勝負ってw
なにか偉そうにしたい/マウントとりたいのがありありだな
なにか偉そうにしたい/マウントとりたいのがありありだな
2018/06/06(水) 14:55:35.99
>>221
違うんじゃね。汚いとか言いだしたらきりがないぞな。言うなら整形して上げたほうが意味あるんじゃね
違うんじゃね。汚いとか言いだしたらきりがないぞな。言うなら整形して上げたほうが意味あるんじゃね
2018/06/06(水) 15:23:05.47
年月日を配列でw
printf "%s %s %s\n" ${aaa[@]} ${bbb[@]} ${ccc[@]} | while read hoge0 hoge1 hoge2; do
fuga=(`echo $hoge2 | sed 's/^\(....\)\(..\)\(..\).*/\1 \2 \3/'`)
if [ -e ~/${hoge1}_${fuga[0]}_${fuga[1]}_${fuga[2]}.mp4 ]; then
exit 0
else
ffmpeg -nostdin -i ~/output/${hoge2}-${hoge0}.aac ~/${hoge1}_${fuga[0]}_${fuga[1]}_${fuga[2]}.mp4
fi
done
からの〜
printf "%s %s %s\n" ${aaa[@]} ${bbb[@]} ${ccc[@]} | while read hoge0 hoge1 hoge2; do
set - `echo ${hoge2} | sed 's/^\(....\)\(..\)\(..\).*/\1 \2 \3/'`
if [ -e ~/${hoge1}_$1_$2_$3.mp4 ]; then
exit 0
else
ffmpeg -nostdin -i ~/output/${hoge2}-${hoge0}.aac ~/${hoge1}_$1_$2_$3.mp4
fi
done
printf "%s %s %s\n" ${aaa[@]} ${bbb[@]} ${ccc[@]} | while read hoge0 hoge1 hoge2; do
fuga=(`echo $hoge2 | sed 's/^\(....\)\(..\)\(..\).*/\1 \2 \3/'`)
if [ -e ~/${hoge1}_${fuga[0]}_${fuga[1]}_${fuga[2]}.mp4 ]; then
exit 0
else
ffmpeg -nostdin -i ~/output/${hoge2}-${hoge0}.aac ~/${hoge1}_${fuga[0]}_${fuga[1]}_${fuga[2]}.mp4
fi
done
からの〜
printf "%s %s %s\n" ${aaa[@]} ${bbb[@]} ${ccc[@]} | while read hoge0 hoge1 hoge2; do
set - `echo ${hoge2} | sed 's/^\(....\)\(..\)\(..\).*/\1 \2 \3/'`
if [ -e ~/${hoge1}_$1_$2_$3.mp4 ]; then
exit 0
else
ffmpeg -nostdin -i ~/output/${hoge2}-${hoge0}.aac ~/${hoge1}_$1_$2_$3.mp4
fi
done
2018/06/06(水) 15:51:47.08
元のソースが汚いと修正も面倒だなとw
まず一旦ループと変数をやめる
if [ -e ~/犬_2018_06_06.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/20180603010000-888.aac ~/犬_2018_06_06.mp4
fi
if [ -e ~/猫_2018_06_06.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/20180603150000-777.aac ~/猫_2018_06_06.mp4.mp4
fi
if [ -e ~/鳥_2018_06_06.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/20180603010000-666.aac ~/鳥_2018_06_06.mp4.mp4
fi
まず一旦ループと変数をやめる
if [ -e ~/犬_2018_06_06.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/20180603010000-888.aac ~/犬_2018_06_06.mp4
fi
if [ -e ~/猫_2018_06_06.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/20180603150000-777.aac ~/猫_2018_06_06.mp4.mp4
fi
if [ -e ~/鳥_2018_06_06.mp4 ]; then
exit 0
else
ffmpeg -i ~/output/20180603010000-666.aac ~/鳥_2018_06_06.mp4.mp4
fi
2018/06/06(水) 15:57:58.57
つぎに、変数に入れ直す
そして書き込もうとしたらNGワードとか言われたから
ついでに関数にする
infile=~/output/20180603010000-888.aac
outfile=~/犬_2018_06_06.mp4
output "$infile" "$outfile"
infile=~/output/20180603150000-777.aac
outfile=~/猫_2018_06_06.mp4
output "$infile" "$outfile"
infile=~/output/20180603010000-666.aac
outfile=~/鳥_2018_06_06.mp4
output "$infile" "$outfile"
output() {
$infile=$1
$outfile=$2
if [ -e "$outfile" ]; then
exit 0
else
ffmpeg -i "$infile" "$outfile"
fi
}
そして書き込もうとしたらNGワードとか言われたから
ついでに関数にする
infile=~/output/20180603010000-888.aac
outfile=~/犬_2018_06_06.mp4
output "$infile" "$outfile"
infile=~/output/20180603150000-777.aac
outfile=~/猫_2018_06_06.mp4
output "$infile" "$outfile"
infile=~/output/20180603010000-666.aac
outfile=~/鳥_2018_06_06.mp4
output "$infile" "$outfile"
output() {
$infile=$1
$outfile=$2
if [ -e "$outfile" ]; then
exit 0
else
ffmpeg -i "$infile" "$outfile"
fi
}
2018/06/06(水) 16:00:15.08
一旦余計な変数を排除する
output ~/output/20180603010000-888.aac ~/犬_2018_06_06.mp4
output ~/output/20180603150000-777.aac ~/猫_2018_06_06.mp4
output ~/output/20180603010000-666.aac ~/鳥_2018_06_06.mp4
output() {
[ -e "$2" ] && exit 0
ffmpeg -i "$1" "$2"
}
output ~/output/20180603010000-888.aac ~/犬_2018_06_06.mp4
output ~/output/20180603150000-777.aac ~/猫_2018_06_06.mp4
output ~/output/20180603010000-666.aac ~/鳥_2018_06_06.mp4
output() {
[ -e "$2" ] && exit 0
ffmpeg -i "$1" "$2"
}
2018/06/06(水) 16:02:16.64
>元のソースが汚いと修正も面倒だなとw
だろ?w そこはスルーでええやん、別に求められているわけでもないんだし
まあ、お疲れ様です(嫌味ではない)
だろ?w そこはスルーでええやん、別に求められているわけでもないんだし
まあ、お疲れ様です(嫌味ではない)
2018/06/06(水) 16:15:15.79
日付の部分を元に戻す
output "$(date +"%Y%m%d010000" -d last-sunday)-888.aac" "犬_$(date +"%Y_%m_%d" -d last-sunday).mp4"
output "$(date +"%Y%m%d150000" -d last-saturday)-777.aac" "猫_$(date +"%Y_%m_%d" -d last-saturday).mp4"
output "$(date +"%Y%m%d000000" -d last-friday)-666.aac" "鳥_$(date +"%Y_%m_%d" -d last-friday).mp4"
output() {
[ -e "$HOME/$2" ] && exit 0
ffmpeg -i "$HOME/output/$1" "$HOME/$2"
}
くだらん文字列結合を省く
output "$(date +"%Y%m%d010000-888.aac" -d last-sunday)" "$(date +"犬_%Y_%m_%d.mp4" -d last-sunday)"
output "$(date +"%Y%m%d150000-777.aac" -d last-saturday)" "$(date +"猫_%Y_%m_%d.mp4" -d last-saturday)"
output "$(date +"%Y%m%d000000-666.aac" -d last-friday)" "$(date +"鳥_%Y_%m_%d.mp4" -d last-friday)"
output() {
[ -e "$HOME/$2" ] && exit 0
ffmpeg -i "$HOME/output/$1" "$HOME/$2"
}
output "$(date +"%Y%m%d010000" -d last-sunday)-888.aac" "犬_$(date +"%Y_%m_%d" -d last-sunday).mp4"
output "$(date +"%Y%m%d150000" -d last-saturday)-777.aac" "猫_$(date +"%Y_%m_%d" -d last-saturday).mp4"
output "$(date +"%Y%m%d000000" -d last-friday)-666.aac" "鳥_$(date +"%Y_%m_%d" -d last-friday).mp4"
output() {
[ -e "$HOME/$2" ] && exit 0
ffmpeg -i "$HOME/output/$1" "$HOME/$2"
}
くだらん文字列結合を省く
output "$(date +"%Y%m%d010000-888.aac" -d last-sunday)" "$(date +"犬_%Y_%m_%d.mp4" -d last-sunday)"
output "$(date +"%Y%m%d150000-777.aac" -d last-saturday)" "$(date +"猫_%Y_%m_%d.mp4" -d last-saturday)"
output "$(date +"%Y%m%d000000-666.aac" -d last-friday)" "$(date +"鳥_%Y_%m_%d.mp4" -d last-friday)"
output() {
[ -e "$HOME/$2" ] && exit 0
ffmpeg -i "$HOME/output/$1" "$HOME/$2"
}
2018/06/06(水) 16:20:37.87
なんかだらだらって感じ
2018/06/06(水) 16:25:36.02
最終的にこんな感じかな(適当にやったので途中のコードはバグありだろう)
output "%Y%m%d010000-888.aac" "犬_%Y_%m_%d.mp4" last-sunday
output "%Y%m%d150000-777.aac" "猫_%Y_%m_%d.mp4" last-saturday
output "%Y%m%d000000-666.aac" "鳥_%Y_%m_%d.mp4" last-friday
output() {
infile=$(date +"$1" -d "$3")
outfile=$(date +"$2" -d "$3")
[ -e "$HOME/$outfile" ] && exit 0
ffmpeg -i "$HOME/output/$infile" "$HOME/$outfile"
}
もっとやりたいならoutput関数を以下のような仕様の引数の関数ににしてもいいし
output 010000 888 犬 last-sunday
output 150000 777 猫 last-saturday
output 000000 666 鳥 last-friday
順番変えてこうすりゃ最初の配列と同じようになる
output 888 犬 010000 last-sunday
output 777 猫 150000 last-saturday
output 666 鳥 000000 last-friday
まあ、配列なんかいらんっちゅー話だ
output "%Y%m%d010000-888.aac" "犬_%Y_%m_%d.mp4" last-sunday
output "%Y%m%d150000-777.aac" "猫_%Y_%m_%d.mp4" last-saturday
output "%Y%m%d000000-666.aac" "鳥_%Y_%m_%d.mp4" last-friday
output() {
infile=$(date +"$1" -d "$3")
outfile=$(date +"$2" -d "$3")
[ -e "$HOME/$outfile" ] && exit 0
ffmpeg -i "$HOME/output/$infile" "$HOME/$outfile"
}
もっとやりたいならoutput関数を以下のような仕様の引数の関数ににしてもいいし
output 010000 888 犬 last-sunday
output 150000 777 猫 last-saturday
output 000000 666 鳥 last-friday
順番変えてこうすりゃ最初の配列と同じようになる
output 888 犬 010000 last-sunday
output 777 猫 150000 last-saturday
output 666 鳥 000000 last-friday
まあ、配列なんかいらんっちゅー話だ
2018/06/06(水) 16:26:18.74
2018/06/06(水) 16:32:01.63
これを続けるの?もうしないだろうw
2018/06/06(水) 16:45:31.82
シェルスクリプトの変数処理って型推論?
2018/06/06(水) 16:46:02.10
そうだな。やるつもりはなかったが、
例えば関数を作りたくなければ、こんな感じで行けるぞってことぐらいかな
while read -r a b c d; do
infile=$(適当に修正しろ)
outfile=$(適当に修正しろ)
[ -e "$HOME/$outfile" ] && exit 0
ffmpeg -i "$HOME/output/$infile" "$HOME/$outfile"
done <<DATA
888 犬 010000 last-sunday
777 猫 150000 last-saturday
666 鳥 000000 last-friday
DATA
こういう場合は標準入力として受け取ってループで回せってことだな
例えば関数を作りたくなければ、こんな感じで行けるぞってことぐらいかな
while read -r a b c d; do
infile=$(適当に修正しろ)
outfile=$(適当に修正しろ)
[ -e "$HOME/$outfile" ] && exit 0
ffmpeg -i "$HOME/output/$infile" "$HOME/$outfile"
done <<DATA
888 犬 010000 last-sunday
777 猫 150000 last-saturday
666 鳥 000000 last-friday
DATA
こういう場合は標準入力として受け取ってループで回せってことだな
2018/06/06(水) 16:46:21.13
>>209
これお願いします
これお願いします
2018/06/06(水) 16:46:50.03
>>210
それなんですか?
それなんですか?
2018/06/06(水) 16:47:01.39
2018/06/06(水) 16:56:31.38
白状する
181からここまで貼られてるソースコード全く読んでない
読む気起きない
181からここまで貼られてるソースコード全く読んでない
読む気起きない
2018/06/06(水) 17:11:54.82
別に構わんよ。きたねーコードだなって
直感的に思って、それを治すことで
俺の直感は正しいことを証明して
自分で納得してるだけだから
直感的に思って、それを治すことで
俺の直感は正しいことを証明して
自分で納得してるだけだから
2018/06/06(水) 17:24:58.19
それは自惚れすぎだなw
2018/06/06(水) 17:33:16.47
誰も求めてない証明ひけらかして悦に浸ってるだけか
2018/06/06(水) 17:41:52.35
自分が汚いコード書いてた(誰でもそうだろう)&そこから綺麗にすることを学んだとこってとこかな
もうちょっと経験つんだらそんな誰でもそうだったとこなんてスルーだろうな。綺麗にすることには際限がない/突き詰めれば&極論では個人の好みに帰結するってとこで、そんな初心者的なのにいちいち文句を言うのが低レベル的なw
もうちょっと経験つんだらそんな誰でもそうだったとこなんてスルーだろうな。綺麗にすることには際限がない/突き詰めれば&極論では個人の好みに帰結するってとこで、そんな初心者的なのにいちいち文句を言うのが低レベル的なw
2018/06/06(水) 17:59:50.87
>>236
もうその話題は終わったよ
もうその話題は終わったよ
2018/06/06(水) 18:30:15.42
>>244
終わってないです
終わってないです
2018/06/06(水) 18:47:23.92
>>245
つまらないからいいよ
つまらないからいいよ
2018/06/07(木) 01:01:10.78
2018/06/07(木) 02:03:34.31
>>212
for hoge in "$aaa" "$bbb" "$ccc"
"$aaa" "$bbb" "$ccc"は、最初のアイテムを示すだけ(888, 777, 666)で間違い
"${aaa[@]"が正しいもしくはとしたかったのだろうが、だったらforの機能的にも変数をArrayにする必要はないだろう。その記述以下でなんかするのでないなら
aaa/bbb/cccは単なる文字列として、for内で必要となったらArrayに分解すれば簡単に目的は達成するだろう
(てか、配列にするならaaa/bbb/cccなんて個々の変数じゃなくてそれこそそれを配列にすればいいのにと思うけど)
aaa="888 犬 `date +"%Y%m%d"010000 -d last-sunday`"
...
for fuga in "$aaa" "$bbb" "$ccc"
do
hoge=$($fuga)
if [ -e ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4 ]; then
...
for hoge in "$aaa" "$bbb" "$ccc"
"$aaa" "$bbb" "$ccc"は、最初のアイテムを示すだけ(888, 777, 666)で間違い
"${aaa[@]"が正しいもしくはとしたかったのだろうが、だったらforの機能的にも変数をArrayにする必要はないだろう。その記述以下でなんかするのでないなら
aaa/bbb/cccは単なる文字列として、for内で必要となったらArrayに分解すれば簡単に目的は達成するだろう
(てか、配列にするならaaa/bbb/cccなんて個々の変数じゃなくてそれこそそれを配列にすればいいのにと思うけど)
aaa="888 犬 `date +"%Y%m%d"010000 -d last-sunday`"
...
for fuga in "$aaa" "$bbb" "$ccc"
do
hoge=$($fuga)
if [ -e ~/${hoge[1]}_${hoge[2]:0:4}_${hoge[2]:4:2}_${hoge[2]:6:2}.mp4 ]; then
...
2018/06/07(木) 02:12:29.31
>>247
必要となったら数値とみなす/数値に変換するだけだろう
a=hoge
の場合は、hogeは数値に変換できないからしょうがないので0にしてまうし、
[ a -eq 0 ]
なんて場合は、数値に変換できないのでエラーになるし。逆にa=1とかでエラーにならないのは数値だからと思えそうだが、単に数値に変換できてエラーにならないだけだろう
あくまでも文字列でしかないのは、
a=1
a="1"
a='1'
のどれも同じってとこからもそう推察できそうな。そもそも明らかな文字列でさえa=hogeだったりするけど
必要となったら数値とみなす/数値に変換するだけだろう
a=hoge
の場合は、hogeは数値に変換できないからしょうがないので0にしてまうし、
[ a -eq 0 ]
なんて場合は、数値に変換できないのでエラーになるし。逆にa=1とかでエラーにならないのは数値だからと思えそうだが、単に数値に変換できてエラーにならないだけだろう
あくまでも文字列でしかないのは、
a=1
a="1"
a='1'
のどれも同じってとこからもそう推察できそうな。そもそも明らかな文字列でさえa=hogeだったりするけど
2018/06/07(木) 02:24:52.46
2018/06/07(木) 02:25:47.02
2018/06/07(木) 02:27:10.73
あら、なんか恥ずかしい
2018/06/07(木) 05:10:54.45
2018/06/07(木) 12:21:50.51
2018/06/07(木) 12:33:31.74
質問です。bashの配列を他のbashスクリプトに
コマンドライン経由でわたすにはどうしたら良いのでしょうか?
コマンドライン経由でわたすにはどうしたら良いのでしょうか?
2018/06/07(木) 12:34:23.18
ちなみに配列変数は一つじゃなくて複数です。
2018/06/07(木) 12:58:55.50
Arrayひとつを単一の文字列で渡して、受けたとった方がArrayに戻すかなあ
sub-script.sh "${array1[*]}" "${array2[*]}" "${array3[*]}" ...
sub-script.sh:
array1=($1)
array2=($2)
array3=($3)
Arrayのアイテムの内容がIFSに引っかかってたらIFSを書き換える(/同調)するかなあ。よくありそうなアイテムがスペースありとかだったら、アイテムの内容として入ってなさそうなタブにするとか
(IFS=$'\t'; sub-script.sh "${array1[*]}" "${array2[*]}" "${array3[*]}" ...)
sub-script.sh:
array1=($1)
array2=($2)
array3=($3)
(分解時のセパレータとしてはタブもデフォルトIFSに入っているので分解時には特に設定する必要はない)
てか、そんなに配列をばんばん使わない方がいいんじゃねと思わなくもないw
sub-script.sh "${array1[*]}" "${array2[*]}" "${array3[*]}" ...
sub-script.sh:
array1=($1)
array2=($2)
array3=($3)
Arrayのアイテムの内容がIFSに引っかかってたらIFSを書き換える(/同調)するかなあ。よくありそうなアイテムがスペースありとかだったら、アイテムの内容として入ってなさそうなタブにするとか
(IFS=$'\t'; sub-script.sh "${array1[*]}" "${array2[*]}" "${array3[*]}" ...)
sub-script.sh:
array1=($1)
array2=($2)
array3=($3)
(分解時のセパレータとしてはタブもデフォルトIFSに入っているので分解時には特に設定する必要はない)
てか、そんなに配列をばんばん使わない方がいいんじゃねと思わなくもないw
2018/06/07(木) 13:38:14.12
>>255
コマンドライン経由の意味はよくわからないが、
多分ファイルを使うのがいいと思う。
[渡す側]
declare | grep "渡したい変数" > /path/save
[受け取る側]
source /path/save
コマンドライン経由の意味はよくわからないが、
多分ファイルを使うのがいいと思う。
[渡す側]
declare | grep "渡したい変数" > /path/save
[受け取る側]
source /path/save
2018/06/07(木) 16:52:21.73
つまり配列そのままで渡せないってことですね
2018/06/07(木) 17:07:52.55
そのままでできると思う方が全くわかってないなという。まあ全くわかってないんだろうけど
2018/06/07(木) 17:16:31.55
ここ数日で盛り上がりすぎやろ
2018/06/07(木) 21:43:15.08
あかんか?
2018/06/07(木) 21:46:19.66
ええで
2018/06/07(木) 22:15:48.04
>>255
xmlなりjsonなり独自形式なりで渡せよ
xmlなりjsonなり独自形式なりで渡せよ
2018/06/07(木) 22:39:09.40
言語のオブジェクト(配列)を他のプロセスにそのまんま渡せるスクリプト言語ってなんかあったっけ?
間にはシリアラズ/デシリアライズなどの仕組みがあるのは当然だが、そんなの全く意識させない言語でサポートしている言語って。フレームワークなど使えばは抜きで。スクリプト言語でなくてもいいけどとりあえずこのスレなのでスクリプト言語で
間にはシリアラズ/デシリアライズなどの仕組みがあるのは当然だが、そんなの全く意識させない言語でサポートしている言語って。フレームワークなど使えばは抜きで。スクリプト言語でなくてもいいけどとりあえずこのスレなのでスクリプト言語で
2018/06/07(木) 23:15:52.17
>>257
あ、
>分解時のセパレータとしてはタブもデフォルトIFSに入っているので分解時には特に設定する必要はない
何言ってんだか。せっかくスペースをセパレータとされるのを避けているのに、設定しなきゃダメだろう
sub-script.sh:
ORIGINAL_IFS="$IFS"
IFS=$'\t'
array1=($1)
array2=($2)
array3=($3)
IFS="$ORIGINAL_IFS"
あ、
>分解時のセパレータとしてはタブもデフォルトIFSに入っているので分解時には特に設定する必要はない
何言ってんだか。せっかくスペースをセパレータとされるのを避けているのに、設定しなきゃダメだろう
sub-script.sh:
ORIGINAL_IFS="$IFS"
IFS=$'\t'
array1=($1)
array2=($2)
array3=($3)
IFS="$ORIGINAL_IFS"
2018/06/07(木) 23:26:19.86
>>265
じぇーそんとかそういうためにあるんじゃないの?
じぇーそんとかそういうためにあるんじゃないの?
2018/06/08(金) 00:05:04.96
2018/06/08(金) 00:07:58.91
見えないってのがどういう意味なのか。
PowerShellみたいのなら見えないに入るのかな?
PowerShellみたいのなら見えないに入るのかな?
2018/06/08(金) 00:18:14.42
分散オブジェクトに近い...つうても実装/言語により全然見えないにはならんけど
process.TheFunc(anObject)
と、呼んだら、別プロセスの
TheFunc(anObject) {
}
に、まんまオブジェクト(ただの配列でもいいけど)が入ってるくるような
PowerShellはそんなんなん?分散オブジェクトかな?
process.TheFunc(anObject)
と、呼んだら、別プロセスの
TheFunc(anObject) {
}
に、まんまオブジェクト(ただの配列でもいいけど)が入ってるくるような
PowerShellはそんなんなん?分散オブジェクトかな?
2018/06/08(金) 00:53:32.27
スレチ
2018/06/08(金) 01:16:08.95
いや、>>259なんて思うのはどういう根拠からかなあと。他のスクリプト言語でそんなんあるんかと
また現れるかもしれんだろw まあ、スレチではある
また現れるかもしれんだろw まあ、スレチではある
2018/06/08(金) 01:20:44.78
>>257,258,254 全部、シリアライズ/デシリアライズのことで、どういうシリアライズ/デシリアライズを使うかでしかなく、まあ、普通はそれしかないわなで終わってることなんだけどね
ちょっとなんか他のスクリプト言語であるのかと気になったので
ちょっとなんか他のスクリプト言語であるのかと気になったので
2018/06/08(金) 03:20:33.75
最近他板でも意味も分からず答える輩が増えていますね。何ででしょう。
2018/06/08(金) 03:21:57.82
新入社員が先輩よりプログラミング知識あることを知って俺結構世間の中でも出来る方なんじゃね?って勘違いする時期だな
2018/06/08(金) 03:49:58.80
解答のクオリティまで下がってるな
パソコンの大先生混ざっとるやろ
パソコンの大先生混ざっとるやろ
2018/06/08(金) 05:43:51.14
>>270
同一プロセス(要するにPowerShell内で閉じてる)ならそんな感じの記述でオブジェクトを渡せる
ちなみにパイプでも渡せる
他のプロセスへコマンドラインとなると無理だろうね
そもそもOSレベルでもたいていのOSはコマンドラインとして文字列の配列しか渡せないし
同一プロセス(要するにPowerShell内で閉じてる)ならそんな感じの記述でオブジェクトを渡せる
ちなみにパイプでも渡せる
他のプロセスへコマンドラインとなると無理だろうね
そもそもOSレベルでもたいていのOSはコマンドラインとして文字列の配列しか渡せないし
2018/06/08(金) 05:51:30.48
JSONは不気味な拡張子なので使ってはいけません
2018/06/08(金) 07:18:25.50
パソコンの大先生なら使いこなせよ
2018/06/08(金) 22:06:27.92
POSIXで定義されているどの環境でも利用できる環境変数ってあります?
$PWDとか。
$PWDとか。
2018/06/08(金) 22:54:13.95
>>280
環境変数で決まってるのは
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html
ただしOS起動中まで含めると、必ず定義されてる環境変数はない。
PWDも昔のシェルだと定義してくれなかったりする。
まあ一般ユーザー権限で動いてるならPATH、HOMEあたりの存在は期待してもいいけど。
環境変数で決まってるのは
http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html
ただしOS起動中まで含めると、必ず定義されてる環境変数はない。
PWDも昔のシェルだと定義してくれなかったりする。
まあ一般ユーザー権限で動いてるならPATH、HOMEあたりの存在は期待してもいいけど。
282名無しさん@お腹いっぱい。
2018/06/08(金) 23:18:13.62 Excelから出力したCSVのように一行(?)の中に改行が含まれた
データを扱うにはどうしたら良いでしょうか?
もう少し具体的に書きます。
カンマ区切りのCSVデータだと仮定して、
シェルスクリプトの中に関数を一行ごとに呼び出し、
列を引数に対応させたいです。
例えば以下のような内容のファイルがあったとして
a1,a2,a3,a4
b1,b2,b3,b4
c1,c2,c3,c4
syori "a1" "a2" "a3" "a4"
syori "b1" "b2" "b3" "b4"
syori "c1" "c2" "c3" "c4"
という風にsyori関数を呼び出したいのです。
ただし実際には各項目(a1等の部分)にExcelから出力したデータのように
改行やカンマやダブルクォートやシングルクォートや空白が入ることがあるのです
データを扱うにはどうしたら良いでしょうか?
もう少し具体的に書きます。
カンマ区切りのCSVデータだと仮定して、
シェルスクリプトの中に関数を一行ごとに呼び出し、
列を引数に対応させたいです。
例えば以下のような内容のファイルがあったとして
a1,a2,a3,a4
b1,b2,b3,b4
c1,c2,c3,c4
syori "a1" "a2" "a3" "a4"
syori "b1" "b2" "b3" "b4"
syori "c1" "c2" "c3" "c4"
という風にsyori関数を呼び出したいのです。
ただし実際には各項目(a1等の部分)にExcelから出力したデータのように
改行やカンマやダブルクォートやシングルクォートや空白が入ることがあるのです
2018/06/08(金) 23:18:34.79
各項目には \ が入ることもあります。
今回はCSVではありませんが、RFC4180(=ExcelのCSVの仕様)では
改行が\nのようにエスケープされません
https://ja.wikipedia.org/wiki/Comma-Separated_Values
> フィールドがコンマ、ダブルクォート、改行を含む場合は、かならずダブルクォートで囲む。
> また、フィールドに含まれるダブルクォートは2つ並べてエスケープする。
>
> "日本 CRLF
> 国","""東京""","127,767,944" CRLF
↑「日本国」の国の前に改行が入っている場合
今回はCSVではありませんが、RFC4180(=ExcelのCSVの仕様)では
改行が\nのようにエスケープされません
https://ja.wikipedia.org/wiki/Comma-Separated_Values
> フィールドがコンマ、ダブルクォート、改行を含む場合は、かならずダブルクォートで囲む。
> また、フィールドに含まれるダブルクォートは2つ並べてエスケープする。
>
> "日本 CRLF
> 国","""東京""","127,767,944" CRLF
↑「日本国」の国の前に改行が入っている場合
2018/06/08(金) 23:19:28.84
>>282-283は、ここから移動してきました
【Bash】Windows Subsystem for Linux【WSL】3
https://mao.5ch.net/test/read.cgi/linux/1528141781/
【Bash】Windows Subsystem for Linux【WSL】3
https://mao.5ch.net/test/read.cgi/linux/1528141781/
2018/06/08(金) 23:23:17.66
286名無しさん@お腹いっぱい。
2018/06/08(金) 23:24:41.882018/06/08(金) 23:31:03.89
2018/06/08(金) 23:35:52.21
2018/06/08(金) 23:57:15.15
邪道としては、改行コードとか\を絶対に使われない文字に置換して最後にまた戻すとかやったな
アルメニア文字とかに置換するんやで
アルメニア文字とかに置換するんやで
2018/06/09(土) 00:06:32.51
今時、シェルスクリプトが使える環境でperlやpythonがデフォルトで入ってないOSの方が稀だろう。なんかここ最近のPOSIXと言えばいいというようなのはなんかアレだな
2018/06/09(土) 00:12:49.10
>>290
busybox、alpine
busybox、alpine
2018/06/09(土) 00:14:40.86
>>291
そういう環境で、CSVファイルの扱いが必要かあ?
そういう環境で、CSVファイルの扱いが必要かあ?
2018/06/09(土) 00:17:26.20
2018/06/09(土) 00:21:35.51
てゆうか問題に適した言語を組み合わせて問題を解くってのが
もともとのUNIXの思想だと思うので、
CSV扱うならCSVに向いた言語使う方がUNIX的だと思うのよね。
まあケースバイケースなんだけど。
もともとのUNIXの思想だと思うので、
CSV扱うならCSVに向いた言語使う方がUNIX的だと思うのよね。
まあケースバイケースなんだけど。
295名無しさん@お腹いっぱい。
2018/06/09(土) 00:23:20.54 つまりC++ってことか。
2018/06/09(土) 00:25:28.50
https://codezine.jp/article/detail/8323
>gawkの開発は「完全を目指すのではなく9割をサクサクこなし、フィールドに改行を含むようなCSVファイルは専用のツールで処理すれば良い」
ですらだからなあ
Linuxはawk=gawkだが、BSDは巣の(?)awkでgawkは別に入れなければならなく、gawkの機能を使うかどうかっていう話ならわかるけど、そんなんだったらperlやpython使った方がLinuxとBSDの違いも無いだろしな
>gawkの開発は「完全を目指すのではなく9割をサクサクこなし、フィールドに改行を含むようなCSVファイルは専用のツールで処理すれば良い」
ですらだからなあ
Linuxはawk=gawkだが、BSDは巣の(?)awkでgawkは別に入れなければならなく、gawkの機能を使うかどうかっていう話ならわかるけど、そんなんだったらperlやpython使った方がLinuxとBSDの違いも無いだろしな
2018/06/09(土) 00:34:57.73
>>287は単に他の言語/知識までは自分の手に余るっていう逃げだろうとしか見えんな
そこに山があるから登るっていうあえてメンドくさいことをしたいってのなら、のらないでもないけどw
そこに山があるから登るっていうあえてメンドくさいことをしたいってのなら、のらないでもないけどw
2018/06/09(土) 00:45:11.89
CSVじゃないって書いてるのに
読めない人多いね
読めない人多いね
2018/06/09(土) 00:50:25.58
とは言ってるけど、CSVとはどう違うとかは全くだな。てか、延々とCSVのここがってしかないやん
CSVと似た何か特殊なものなら、普通にストリームの一文字一文字処理できるスクリプト使ったほうがいいだろう、てかそれしかないだろう
CSVと似た何か特殊なものなら、普通にストリームの一文字一文字処理できるスクリプト使ったほうがいいだろう、てかそれしかないだろう
2018/06/09(土) 01:21:51.27
> シェルスクリプト(POSIX)
(;^ω^)
(;^ω^)
2018/06/09(土) 01:40:22.57
POSIXはまあいいとしてPOSIXという単語が出る度アレルギーのごとく反発する人はなんなの?
OpenGroupに親でも殺されたのか?
OpenGroupに親でも殺されたのか?
2018/06/09(土) 01:46:42.05
>>290
だって課題がそうなってるんだもん
だって課題がそうなってるんだもん
2018/06/09(土) 01:53:39.41
2018/06/09(土) 02:06:03.67
nkfとかiconvで 改行コードを調べたらええんちゃう?
busybox, alpineぐらいのコンテナに nkf を足したぐらいで大してでかくならんやろうに。
busybox, alpineぐらいのコンテナに nkf を足したぐらいで大してでかくならんやろうに。
2018/06/09(土) 02:11:54.28
>>287でposix shellだけで言うてるからダメだよ
2018/06/09(土) 03:14:25.32
ぽ…POSIX
2018/06/09(土) 03:39:18.86
今日はみなさん夜更かしですね
まるで自えn(ry
まるで自えn(ry
2018/06/09(土) 06:55:43.82
>>293
お前さんこの間から痛いぞ
お前さんこの間から痛いぞ
2018/06/09(土) 09:19:07.59
はいはい
2018/06/09(土) 12:31:39.35
はい、は一回
2018/06/09(土) 13:35:30.76
はいは一回 と
はいぱー回 ってにてるな
はいぱー回 ってにてるな
2018/06/09(土) 13:36:18.92
そうか?
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 渡邊渚「性を売ってるくせに」批判に反論 幻滅「これが日本の現状だよなー」「『渾身の下着!』というような意味でやってない」★2 [Ailuropoda melanoleuca★]
- ひろゆき氏、日中対立に 「結局、人口というのは国力なので。10億人以上いる国に、1億2000万人で対抗可能であるというのが間違い」 [冬月記者★]
- 「おこめ券」でJAを救済したいだけ…税金4000億円で"史上最高値のコメ"を買わせる農水大臣とJAの癒着ぶり [バイト歴50年★]
- 渡邊渚さん脅迫か 写真集に包丁置く写真投稿 30代女性書類送検 渡邊さん「外に出るのも怖く身の危険を感じる」 [ひかり★]
- 【千葉】会社で58歳女性刺される 殺人未遂容疑で同僚の中国籍の男(39)逮捕 女性死亡 いすみ市 [ぐれ★]
- 58歳ミュージシャン俳優、高市首相のアーティスト支援表明に「自分で潰しておいてどの口が…」 [muffin★]
- ゴキブリとかいう3億年も進化してない奴らwww
- お茶会聯合自治政府 貳
- 【風向き】ヤバい!高市が導入を検討する「防衛特別所得税」、ネトウヨらもまさかの反対の大合唱。。さすがに国民を舐めすぎたか? [219241683]
- 元グラドルで国会議員の佐々木りえ(43)、夫にサンドイッチのパンを頼んだら6枚切りを買ってきてキレそうに→Xで絡まれさらにキレる [808139444]
- 【速報】人気ミュージシャン、高市首相のアーティスト支援表明にブチギレ「自分で潰しておいてどの口が…一刻は早く辞任しろ!」 [339712612]
- 嫌儲に居る孤独なジジイ、ガチで気持ち悪い。さっさと死ねよ [242774294]
