シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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に逃げずにシェルスクリプトで処理するのが頭のいいやり方。
質問に対して問題が間違ってるといちゃもんをつけるのもやめましょう
シェルスクリプト総合 その27
https://mevius.5ch.net/test/read.cgi/unix/1525337663/
探検
シェルスクリプト総合 その28
■ このスレッドは過去ログ倉庫に格納されています
2018/08/02(木) 05:22:16.82
2022/08/08(月) 21:06:49.38
2022/08/14(日) 20:39:40.32
POSIX準拠じゃなくてもFreeBSDで動くけどな
POSIXにないのでも、ツール間で合わせ合う、どっちかがどっちかに似せるというのは普通にあるしな
POSIXにないのでも、ツール間で合わせ合う、どっちかがどっちかに似せるというのは普通にあるしな
2022/08/14(日) 21:19:42.49
POSIXにないオプションは使用禁止だ
そんなものを使うと持続性がなくなる
なんらかの理由で別のOSに変更になった時
システムは動かなくなってデータはただのゴミになる
何度言えば理解できるのか
そんなものを使うと持続性がなくなる
なんらかの理由で別のOSに変更になった時
システムは動かなくなってデータはただのゴミになる
何度言えば理解できるのか
2022/08/15(月) 12:57:39.48
はいはい、原理主義ごくろうさん
使ってる本人次第でしかないのに押し付けとかホント原理主義者は
使ってる本人次第でしかないのに押し付けとかホント原理主義者は
2022/08/15(月) 13:03:07.61
原理主義者は自惚れてるけど無知さがだだ漏れる
無知さを隠す誤魔化すためのマウント取りでしかない
無知さを隠す誤魔化すためのマウント取りでしかない
586名無しさん@お腹いっぱい。
2022/08/15(月) 13:26:13.07 リッチー大佐はC言語も使える
ただし分割コンパイルやmakeといった高度な機能は使わない
そんなものはなくてもシェルスクリプトでmake.shを作れば良いからだ
ただし分割コンパイルやmakeといった高度な機能は使わない
そんなものはなくてもシェルスクリプトでmake.shを作れば良いからだ
2022/08/15(月) 13:28:32.48
>>581
pkg install findutils
pkg install findutils
2022/08/15(月) 14:25:12.28
それ入れなくてもFreeBSDのfindで可能だけどな
がっつりGNU依存のにしても、それ入れる+ちょっとパス修正だけだわな
がっつりGNU依存のにしても、それ入れる+ちょっとパス修正だけだわな
2022/08/15(月) 16:04:55.82
BSDのfindなら
find 場所 -print0 | xargs -0
find 場所 -print0 | xargs -0
2022/08/15(月) 20:36:03.11
持続性なら、もはやPOSIXよりも、Linuxのほうがいいのでは。
2022/08/16(火) 12:18:54.66
posixってソフトウェア規格でしょ?
2022/08/16(火) 12:28:09.90
ソフトウェア規格って?
公式ページでも見れば?
公式ページでも見れば?
2022/09/19(月) 12:12:56.52
bashの関数で文字列を返したい場合、その関数名を文字列名称に使うことは仕様的に可能ですか?
function kotae () {
kotae=$1$2
}
kotae ab cd
echo $kotae
function kotae () {
kotae=$1$2
}
kotae ab cd
echo $kotae
2022/09/23(金) 09:54:01.90
2022/09/23(金) 09:55:09.11
concはkotaeの間違い
頭の中で勝手に命名しちゃった
頭の中で勝手に命名しちゃった
2022/09/24(土) 14:46:59.72
2022/10/28(金) 02:25:37.28
bash 5.2.2(1)で最初の!だけ全角の
echo "abc!? xyz!"
は通るのに、半角にすると
echo "abcecho "abc!? xyz!"
>
になってしまいます。
一対の"で通すにはどうすればいいのでしょうか?
>>594-596
ありがとうございます。
printfのvオプションは初めて知りました。
echo "abc!? xyz!"
は通るのに、半角にすると
echo "abcecho "abc!? xyz!"
>
になってしまいます。
一対の"で通すにはどうすればいいのでしょうか?
>>594-596
ありがとうございます。
printfのvオプションは初めて知りました。
2022/10/28(金) 13:13:38.41
ヒストリ機能
知らない/活用してないならオフにしておくべき
対話モードでしか機能しないから切っても特に問題はない
知らない/活用してないならオフにしておくべき
対話モードでしか機能しないから切っても特に問題はない
2022/10/29(土) 10:43:22.22
バックスラッシュをつけてエスケープ。
2022/11/06(日) 16:47:34.57
恥を忍んで質問させて下さい:
Larry Wallせんせーが書いたmetaconfigが普及せずに、同じ機能を果たす、
Autoconf/Autotoolsが普及した理由って何でしょう?
1)Perlよりm4の方が普及してた(どっちも文法はアレだけど)
2)というかPerl嫌いな人が少なくなかった
3)そのほか(開発モデルとか)
...imakeって何だっけ?
Larry Wallせんせーが書いたmetaconfigが普及せずに、同じ機能を果たす、
Autoconf/Autotoolsが普及した理由って何でしょう?
1)Perlよりm4の方が普及してた(どっちも文法はアレだけど)
2)というかPerl嫌いな人が少なくなかった
3)そのほか(開発モデルとか)
...imakeって何だっけ?
601名無しさん@お腹いっぱい。
2022/11/06(日) 18:24:19.31 Autoconf/AutotoolsはGNUだからじゃね?しらんけど
2022/11/07(月) 01:26:02.31
rsync -avR -e ssh ...
rsync -avR -e ssh ...
このように6行以上書くとエラーになるんですがどうしてでしょう?
ssh: connect to host xxxx: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(228) [sender=3.2.3]
rsync -avR -e ssh ...
このように6行以上書くとエラーになるんですがどうしてでしょう?
ssh: connect to host xxxx: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(228) [sender=3.2.3]
2022/11/07(月) 06:20:59.25
6行以上書いたからじゃね?
2022/11/07(月) 07:38:39.12
>>602
クライアントからの接続要求の処理中に次の接続要求が来たら待たせるようになっててそのバッファが5個だからそれ以上に次々と接続要求きたらConnection refusedを返すようになってる
少し時間を空ければ大丈夫なはず
てか、サーバーは何?
クライアントからの接続要求の処理中に次の接続要求が来たら待たせるようになっててそのバッファが5個だからそれ以上に次々と接続要求きたらConnection refusedを返すようになってる
少し時間を空ければ大丈夫なはず
てか、サーバーは何?
605602
2022/11/07(月) 11:40:12.512022/11/08(火) 09:01:57.74
もしかしてファイル転送を多重化しようとしてるのかな そういうオプションがあったような気がするけどね rsync
2022/11/08(火) 23:15:42.53
はい、ぶたがみーるー
まあ、ここにも俺がいるわけですけどねw
まあ、ここにも俺がいるわけですけどねw
2023/03/27(月) 06:41:34.11
バックしまーす
2023/06/18(日) 23:35:36.05
function YesNo {
local yn
while true; do
read -p " [Yes/No" "$1" "]: " yn
case $yn in
[Yy]*) return 0 ;;
[Nn]*) return 1 ;;
[Ee]*) if [ ! "$1" = "" ]; then return 2; fi ;;
esac
done
}
#main
YesNo ":いいえ /Else:その他"
echo $?
exit
実行すると、read: `:いいえ /Else:その他': 有効な識別子ではありません
とエラーになるのですが、どうすればいいでしょうか?
local yn
while true; do
read -p " [Yes/No" "$1" "]: " yn
case $yn in
[Yy]*) return 0 ;;
[Nn]*) return 1 ;;
[Ee]*) if [ ! "$1" = "" ]; then return 2; fi ;;
esac
done
}
#main
YesNo ":いいえ /Else:その他"
echo $?
exit
実行すると、read: `:いいえ /Else:その他': 有効な識別子ではありません
とエラーになるのですが、どうすればいいでしょうか?
610名無しさん@お腹いっぱい。
2023/06/19(月) 06:14:08.74 -p に渡っているのは " [Yes/No" だけで、残りの "$1" と "]: " は yn と同じく変数名として解釈されている
read -p " [Yes/No $1 ]: " yn
read -p " [Yes/No $1 ]: " yn
2023/06/23(金) 17:18:03.40
テスト
2023/08/23(水) 21:31:25.96
これってどうしてそうなのだろう?
2023/08/27(日) 18:57:22.73
readコマンドの引数にダブルクォートを使ってるからだぬ
だから>>610氏が指摘しているコトになってるぬ
だから>>610氏が指摘しているコトになってるぬ
2024/02/20(火) 08:47:58.81
先にBを算出することもなく変数の追加もなしで処理2を1箇所にすることは可能でしょうか?
if [ A ]; then
Bを算出
if [ B ]; then
処理1
else
処理2
fi
処理2
fi
if [ A ]; then
Bを算出
if [ B ]; then
処理1
else
処理2
fi
処理2
fi
2024/02/20(火) 14:15:04.07
2度目のエルスを書かなければいいだけじゃなくて?
616名無しさん@お腹いっぱい。
2024/02/20(火) 17:32:39.42 >>615
「処理2」は2度処理される必要があるのかもしれん。例えば、ステータスを1 upするような。
出題者はおそらくelse節を冗長処理として、1度きりの処理の意味で「1箇所にする」と要件を定義したのだろう。
が、現実にこんなアバウト野郎のかもす空気を読んでウカウカとelse節を削ると、分かりにくいバグになったりする。
なので、問題を正確に記述しろ糞ボケと回答すべきだと思う。
「処理2」は2度処理される必要があるのかもしれん。例えば、ステータスを1 upするような。
出題者はおそらくelse節を冗長処理として、1度きりの処理の意味で「1箇所にする」と要件を定義したのだろう。
が、現実にこんなアバウト野郎のかもす空気を読んでウカウカとelse節を削ると、分かりにくいバグになったりする。
なので、問題を正確に記述しろ糞ボケと回答すべきだと思う。
2024/02/22(木) 06:05:52.23
>>614
else 足りなくね
処理2を1度または2度実行するのに、1箇所にしたいとかイミフ
!Aだったら処理2をする つもりなら、そのまま書けばいいだけだな。シェルスクリプトならw
Bを前もって算出できるなら、[ A -a B ] って本人も分かってるだろうが、Bを算出することもなくでも、そのまま書こうと思えばかけるわな、 [ A -a { Bを算出; B; } ] 風に
else 足りなくね
処理2を1度または2度実行するのに、1箇所にしたいとかイミフ
!Aだったら処理2をする つもりなら、そのまま書けばいいだけだな。シェルスクリプトならw
Bを前もって算出できるなら、[ A -a B ] って本人も分かってるだろうが、Bを算出することもなくでも、そのまま書こうと思えばかけるわな、 [ A -a { Bを算出; B; } ] 風に
2024/02/22(木) 18:42:19.24
{ ifを何重にもネストしたブロック } || 処理2
みたいなのでも
みたいなのでも
619名無しさん@お腹いっぱい。
2024/03/14(木) 17:20:13.74 while ...do
処理1
done <<=LIST=
リスト1
=LIST=
while ...do
処理2
done <<=LIST=
リスト1
=LIST=
てののリスト1を一つにできんべか。ただし、リスト1全てに対し処理1をし終えてから処理2を行なう必要があるので、
while ...do
処理1
処理2
done <<=LIST=
ではあかん。
処理1
done <<=LIST=
リスト1
=LIST=
while ...do
処理2
done <<=LIST=
リスト1
=LIST=
てののリスト1を一つにできんべか。ただし、リスト1全てに対し処理1をし終えてから処理2を行なう必要があるので、
while ...do
処理1
処理2
done <<=LIST=
ではあかん。
620名無しさん@お腹いっぱい。
2024/03/14(木) 18:05:33.59 ヒアドキュメントの中で変数を展開できます。
LIST_CONTENT="リスト1
...
"
while read s; do
printf '%s\n' "${s}"
done <<LIST
${LIST_CONTENT}"
LIST
LIST_CONTENT="リスト1
...
"
while read s; do
printf '%s\n' "${s}"
done <<LIST
${LIST_CONTENT}"
LIST
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 高市早苗首相、人口減少問題で「地方は東京を見習って」発言に違和感 鳥取・平井知事、県議会で言及 ★2 [Hitzeschleier★]
- 【速報】 山上徹也被告が謝罪 「何の恨みもありません。非常に申し訳ないことをした」 ★2 [お断り★]
- 『M-1』決勝進出9組発表 エバース、ヤーレンズ、ヨネダ2000、ママタルト、真空ジェシカら進出 [muffin★]
- 芸人・永野が断言 令和が「1」なら昭和は「100楽しかった」「夢いっぱいだった」★3 [muffin★]
- 橋下徹、「安全地帯にいる政治家たちの行動で民間が犠牲になる…まっぴらゴメン」 麻生太郎氏の高市首相の発言支持に言及 [jinjin★]
- 自宅で1万円札をカラーコピー、「パパ活」支払いで使った52歳男に有罪判決…「偽札と言いにくい人にだけに渡し悪質」 [蚤の市★]
- ネトウヨ「野党は全員スパイ」→驚愕の4.2万いいね マジのガチでもう終わりだよこの国 [314039747]
- 「90年代までの日本人は皆が明るかった!」→これマジなの? [346195464]
- 【悲報】日本維新の女議員、旦那にサンドイッチ作るからパン買ってこいと命令し、6枚切りを買ってきたため発狂wwwwwwwwwwwwwwwwwww [802034645]
- キャンタマボールっておかしくね?
- キッッッッッッッッッッッッッッッッッッッッッッッッッッッッッッッッショwwwwwwwwwwwwwwwwww
- 諸行無常と色即是空の言葉で大体全てが解決する
