X



シェルスクリプト総合 その28
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
垢版 |
2018/08/02(木) 05:22:16.82
シェルスクリプトの総合スレです。
□お約束
・特記なき場合は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/
0370名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 06:15:51.15
>>354
> イニシャルでファイルを8つくらいに分け、引数見て探すファイルを割り振るだけで十分一秒切れる
前方一致検索ならそれでもいいと思うけど、中間一致や全文検索だと結局すべてのファイルをgrepしないといけない

SQLiteなら全文検索もあるようだ
http://ytyaru.hatena(ドット)com/entry/2017/07/19/000000

>>360
> ただ、自前の辞書に索引付けてdictのdbに変換…ってのは面倒なんだよ
インデックスつけるのが面倒なんでしょ?
SQLiteならテーブル作ってデータを入れていくだけだよ
0374名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 07:58:28.04
使えるならnamed pipeが行儀良いと思うけど、ポーリングさせるならただのファイルでも環境変数でも何でもいいんでね
あんまりSSDへ頻繁に書き込みたくないなら環境変数か

個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら、ファイル分割で必要十分だろ
メモリも今時100MBくらい一時占めるのは有りだとしても、常駐させるとなるとチリツモ
0375名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 08:03:33.44
>>374
いや、ファイルや環境変数を使うというのはどうでも良くて
それらをどう使って実現するのか?って話だよ。

あなた、自動運転を実現するにはどうしたら良いか?って言う話に
AIを使えばできるんです。みたいなことしか言ってないよw
0377名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 08:05:46.31
> 個人コマンドラインツールで一秒で返ってくれば問題ないという要件なら
個人用途であれば、その程度でも構わないってことには反論はしないけどね
C10K問題(クライアント1万台問題)が発生するような場合には、それじゃ使い物にならないけど
0378名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 08:08:59.98
>>376
もしかして

1. コマンド実行
2. 特定のディレクトリにファイルを作る
3. デーモンが1秒おきにそのディレクトリを監視している
4. デーモンはファイルを見つけたら処理をして新しく結果ファイルを作る
5. 1のコマンドは結果ファイルができるまで待ってて見つけたらその内容を表示する

って話?
0380名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 08:12:00.68
・パイプで繋ぐと早い。
・標準入力を<でリダイレクトするより、パイプを通じてcatで流し込んだ方が早い。

経典に書いてあるw
0385名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 08:47:09.09
>>378
おれはそう解釈するけど
結果もクエリも数行だろうから、環境変数の方がいい

標準sleepは1s単位なので微妙に要件満たせないけど、適当な代替コマンド用意できないなら2秒になってしまうが…
msec sleep便利よ

サーバスクリプトは$queryを1s sleepしながらループしてチェック、空で無ければクリアして検索に入り、$responseに書き出す

検索時間をa-zの26ファイルに分けて検索時間を1/26~0.1s程度にまで削減、コードも頭文字とファイル名に整合が取れて短くなるだろう
フォアグラウンドのクライアント側は$query設定して1s sleep、(既に設定されているはずの)$responseを標準出力へ書き出す

完了フラグ立てるとか面倒な事やるのはシェルスクリプトの領分超えてると思うわ
$responseが空ならエラー吐いて落とす
何回か走らせてみて、時間は適宜調整で決め打ちが楽だろう
0387名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 09:05:22.83
>>385
> 結果もクエリも数行だろうから、環境変数の方がいい

いやいや環境変数は子プロセスには伝搬するけど
デーモンとコマンドのように親子関係にないでは
やり取りできないんだよ
0389名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 09:07:47.64
> サーバスクリプトは$queryを1s sleepしながらループしてチェック、空で無ければクリアして検索に入り、$responseに書き出す
なんつーかシェル変数(環境変数)をグローバル変数とでも勘違いしてるような書き方だな

サーバースクリプトが$responseに書き出しても
それは他のプロセスからは見えないんだよ
0390名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 09:15:02.13
> 検索時間をa-zの26ファイルに分けて検索時間を1/26~0.1s程度にまで削減、コードも頭文字とファイル名に整合が取れて短くなるだろう

それだと中間一致には対応できない
0391名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 09:27:09.09
>>389
たしかに
クライエントから起動するわけじゃないから、コマンド置換やsourceも使えないし、PID把握して/proc以下のfdに書き込む必要あるのか
readするって言ってる>>361の方が多分俺より賢いな

面倒だからやっぱ一時ファイルで…
0392名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 09:33:01.34
直接の親にならdeclareの拡張や文字列evalシェル関数で書き換えられるけど、兄弟の環境は変える手段無いのか
0393名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 09:40:41.97
兄弟でもメインループの中でexport hoge=hageをファイルに書き出して互いにsourceすれば共有できるぞ
結局一時ファイル作ることになるから、それを許容するなら全部一時ファイルでやり取りするか、
それを嫌うならpsでPID特定して直接リダイレクト
0395名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 10:40:20.45
シェルスクリプトから離れてごめんだけど、dicodはちゃんとした辞書形式(索引-シーク位置)にコンパイルしなくても受け付けてくれたはずだよ、dictは使ってないので分からん
emacsの何とか形式ってやつがマニュアルに記載あったはず、単なる見出し+テキストのプレーンテキスト
マニュアルが激しく読みにくいけどsedあたりで頑張ってみたら

まあ索引付けないならgrepより速くなる保証もないわけだけど
曖昧検索や部分一致、逆引き、履歴等々色々高度な事もできるので、例え遅くてもやる価値はあるかと
0396名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 10:54:30.10
これね
https://puszcza.gnu.org.ua/software/dico/manual/dico.html#outline

PDICクライアントは
見出し セパーレータ テキスト(改行等エスケープ) セパレータ 関連語等のメタデータ
でエクスポートできたはずなので、sed等でセパレータ後にタグ前置、次いでセパレータを改行に置換すれば大体おんなじ構造

下の方見るとpythonの辞書(ハッシュ実装)も受け付けるようなので、もしパフォーマンスに不満があれば次に試すと良さそう
0397名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 11:03:27.84
あー
descriptionとinfoタグは辞書についてのもので、項目はヘッダと本文のみ、メタデータは対応してないか
まあ本文に含めてしまって、逆引きで代替できると思う…
0398名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 11:18:26.85
>>391
> PID把握して/proc以下のfdに書き込む必要あるのか
え?そんなことできるんか?
/proc以下のファイルは調べることが出来るわけで
そんなこと出来たら不正なデータをインジェクションできてしまう気がするんだが
0399398
垢版 |
2021/05/22(土) 11:22:16.30
マジか・・・。できたわw
0400398
垢版 |
2021/05/22(土) 11:23:12.33
あー、でもprocが必要だからmacOSじゃ無理?
0401398
垢版 |
2021/05/22(土) 11:31:23.11
あ、勘違いっぽい。こんな感じで1〜10の頭に>をつけて出力させてる間に
seq 10 | { echo $BASHPID; while read a; do echo "> $a"; sleep 5; done; }

他の端末から echo aaa > /proc/<PID>/fd/1 ってやったら
確かに 1〜10 の間に出力が割り込まれたけど頭に>はついていなかった
0402名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 11:33:56.66
>>398
プラットフォームによって違うと思うけど、ubuntuなら/proc/PID/fd/0|1|2、何だったかのunixではstdin|out|errが各プロセスのfile descriptorへのシムリンクになってるはず(/dev以下、/tmpとか)
自分の起動したプロセスなら当然rw権限はある、無ければそもそも入出力できないよ
システムに関わるデーモンなんかはroot権限で走ってるはずなので、セキュリティ的に問題は起きない
0403398
垢版 |
2021/05/22(土) 11:40:45.06
連投ごめん。標準入力のファイルディスクリプタは0だった

んで、すこし変えてこんなふうにして実行してみたんだけど
for i in $(seq 10); do sleep 5; echo "$i"; done | { echo $BASHPID; while read a; do echo "> $a"; sleep 5; done; }
本当に他端末から出力の間に割り込ませられたよ・・・

seq 10 してるから 10 個の数字が出力されると思いきや
それ以上の適当な文字を出力させられる。
これセキュリティ的に大丈夫なん?
0404398
垢版 |
2021/05/22(土) 11:44:28.31
うーん、自分しか読み書きできないから大丈夫・・・なのか?
それにしてもコマンドの出力結果の間に出力を割り込ませられるとはwww
0405名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 11:52:44.59
echo helloでコンソールに文字が出るのも、キーボードから入力できるのも、ファイルをディスクに書き出すのも、シェルが暗黙のうちにそのデバイスファイル群を繋ぎ合わせてる結果
なんら特別な事じゃないよ
0406398
垢版 |
2021/05/22(土) 11:57:08.22
proc使えば別プロセスの環境変数も読み込める・・・と思ったら起動時の環境変数か。
ってことは別プロセスから新たに子プロセスを起動すれば
まあいろいろできそうだけど、どっちみちprocが必要なんだよな

>>405
それはそうだけどproc=カーネルがあるプロセスの情報を
他のプロセスに公開してるからできることだよね?

macOSとかはprocがないから、内部的にはデバイスファイル郡を
つなぎ合わせていたとしてもそれが他のプロセスからは見れないはず

いずれにしろPOSIX標準ではなさそう
0407名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 12:12:52.06
そもそもカーネルやシステム中核プロセスが不可視であるべき、ってのは常識なのか?

ディレクトリの閲覧権限はxとwで制限できるから、そりゃ隠れてるのも居るかもしれないけどさ

Macは使わないので分からんが、windowsだってタスクマネージャ開けばユーザー権限で干渉不可なシステムプロセスがゾロゾロ動いてるの見えるけど
0409名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 12:40:36.82
UNIXの全てがファイルという考えは面白かったが
本当に全てがファイルであるというは正しい考えなのだろうか?
0410名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 12:58:05.17
読み書き出来るならファイルと見做せるんじゃね
環境変数なんかは読み書きできるけどファイルじゃないね
cpuは一応procにcpuinfoあるけど、別にフルアクセスできるわけじゃなし形だけね
lsofやpsで情報が得られるが、lsでアクセスできないならファイルとして抽象化されていない、でいいのかな(procfsが無いならlsできない、でいいの?)

それならOSのレベルで抽象化しなくても、シェルのレベルでファイルシステムのように見せる事もできる
windowsがそうだ)
cmdの振る舞いを見るとOSレベルでの一貫性は皆無だけど、pwshからはプロセス、レジストリ、環境変数まで全部ファイルシステムとして読み書きできるわけで
0411名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 13:02:29.53
> (procfsが無いならlsできない、でいいの?)
無理やりlsで表示させるんじゃなくて
別の形のコマンドを作るべきじゃなかったのか?ということ
0412名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 15:40:34.99
>>408
race conditionって具体的に何だろ、デバイスファイルに読み書き競合、あるいは排他制御でブロッキング頻発か

event pollみたいな仕組みはlinux固有だっけ?
どう上手くやろうがfdのやりくりをする方式はスケーラブルじゃないと思ってる
多重I/Oでパフォーマンス向上とか言ってOSに過剰なfd要求コール送り続けてるんだから
0413名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 17:08:31.51
>>412
たぶん情報を取得したが取得中にリアルタイムで情報が変わってしまい
矛盾した情報になってしまったとかじゃね?
もしくは複数のファイルから取得した情報が矛盾してしまうとか

情報を取得してからそれを利用するまでの間に時間があるから
取得した情報が信用できないというのは当然として少なくとも取得した時点では
それらの情報は矛盾しないようにスナップショットである必要がある
0414名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 22:12:21.51
例えば歯抜け連番名ファイルを詰めて連番にする場合
for f in renban* ; do
mv $f 新ファイル名
done
とやると、該当ファイルが0個でもループ内の mv を実行しようとしてエラーになります。
ループ前に該当ファイルの有無のチェックが不要な方法はないでしょうか?
0415名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 22:12:33.00
>>412
懐しいw
pollがSVRで、BSDがselectってやつかな?w
Linuxは両方使えたが、少くとも昔のLinuxカーネルでは実装はほぼ同じだったけどな…
0416名無しさん@お腹いっぱい。
垢版 |
2021/05/22(土) 22:35:09.95
>>414
たぶんrenban*がfに入るってるよね
モダンなシェルならsetで好きな挙動選べるよ
(bashならnullglobとかglobfailとか)

ただ、わざわざその一文の為にオプションいじくるよりは普通にチェックした方がいいと思うよ
たまにおまじない書き忘れて頭ひねったりするから
0417名無しさん@お腹いっぱい。
垢版 |
2021/05/23(日) 06:00:13.67
こんな感じかなあ?

set -- renban*
[ $# -eq 1 ] && [ ! -e "$1" ] && set --
for f in "$@"; do
mv $f 新ファイル名
done

でもまあ、ファイル名一覧を取得してからmvしてる間に
ファイルが別プロセスによって消されてリすることがあるから
どちらにしろmvがエラーになる可能性はあるんだよね
0418名無しさん@お腹いっぱい。
垢版 |
2021/05/23(日) 10:42:49.61
ls renban* | while read f;do mv $f 新ファイル名; done
だとループには入らないけど、ファイルがないときにlsがエラー吐くねw

find -maxdepth 1 -name "*.csv" | while read f;mv $f 新ファイル名;done
これでどう?w
> ファイルが別プロセスによって消されてリすることがあるから
↑もちろんこの問題は避けられないけどね。
0419名無しさん@お腹いっぱい。
垢版 |
2021/05/23(日) 10:45:47.34
どうせワンタイムだろうしあんまり細かいこと気にしてるとハゲるぞー

といいつつ
もしrenbanが何万にものぼるとして、globしてからmvに取り掛かるまでの時間差が気になるんだったら
findに-name 'renban*'を処理させ、アクションの逐次実行を指定する;を渡せば隙は(ほぼ)ないはず
-exec {} target$suffix \;
+を渡すと速いけどバッチ処理だからglobとおんなじ
0420名無しさん@お腹いっぱい。
垢版 |
2021/05/23(日) 10:55:53.30
>>419
find -maxdepth 1 -name "renban*" -exec mv {} 新ファイル名 \;
かw

そうだね、それが正解だw
(なんでもパイプで渡してしまう悪いくせを晒してしまった…w)
0422名無しさん@お腹いっぱい。
垢版 |
2021/05/23(日) 11:15:08.17
>>421
まあ、依頼主の要望を可能な限り叶えたまでさ。
あとは好みと状況でどちらでもお好きな方をw
ただ、この場合lsでやっつけてるけど、本当はlsの出力はそんなにあてにして
いいものではないので、気をつけて。
いろんな意味でfind -execの方が正統だよ。
0423419
垢版 |
2021/05/23(日) 12:19:18.50
shのglobはソート済みが保証されてたと思うけど、findはどうだったか自信がない…

誰か試せる人補足よろしく
0425名無しさん@お腹いっぱい。
垢版 |
2021/05/23(日) 13:14:58.68
>>423
findはディスクに忠実にファイルシステム上の順番だね。
そして、globは確かにソートされてるようだ。
ちなみにlsもソートされるし、それはオプションで変えられる、と。
一応、環境書いとくと、Fedora33のbashにて
0428名無しさん@お腹いっぱい。
垢版 |
2021/05/24(月) 02:05:05.30
414です
回答ありがとうございます。
ループ前チェックは何だか美しくないように思えたので(個人の感想です)
0個なら即doneに移る方法はないものかとお尋ねした次第です。

0個でも一度はループに入るという仕様が続いているのはきっと何か意味があるのでしょうね。
0429名無しさん@お腹いっぱい。
垢版 |
2021/05/24(月) 08:05:21.35
ループじゃなくて*の展開の仕様だよ
合理的に考えれば、展開を指示してマッチ無しならば0件にヒットしたとして何も返さないか空文字
展開が失敗したと考えてエラーのどちらかだろう
多分深い意味はないから気にすんな
0431名無しさん@お腹いっぱい。
垢版 |
2021/05/24(月) 09:50:48.81
>>419
> どうせワンタイムだろうしあんまり細かいこと気にしてるとハゲるぞー
うっせーハゲ!
0432名無しさん@お腹いっぱい。
垢版 |
2021/05/24(月) 10:20:26.93
lsとglobがソートされるってどこに書いてあったっけ?
前に見た気がするけど英語の中から探すのめんどいw
0433名無しさん@お腹いっぱい。
垢版 |
2021/05/24(月) 10:48:30.44
globで見つからなかった時、検索した文字列を返すのは
おそらく安全側に倒したからだと思ってるんだがいい例が思いつかないな

例えばcmd renban* hoge.tar.gzだったら普通は引数が2個以上になると思うが
見つからない時cmd hoge.tar.gzとなって危険とか
もしくはエラーメッセージをわかりやすく出すのが目的だったりするのかな?

空ディレクトリでls renban*を実行した時

「renban*」という文字列を返せば、エラーメッセージは分かりやすい
> ls: 'renban*' にアクセスできません: そのようなファイルやディレクトリはありません

空文字を返せば、エラーメッセージは分かりにくい
> ls: '' にアクセスできません: そのようなファイルやディレクトリはありません

何も返さなければ、何も表示せず正常終了
・・・あ、これかw

空ディレクトリでない(file1 file2 file3というファイルが有る)場合renban*が
何も返さないとlsが実行されるからfile1 file2 file3と表示されるんだ
renbanなんたらを処理しようとしてるのに、関係ないファイルを処理してしまう。
0434名無しさん@お腹いっぱい。
垢版 |
2021/05/24(月) 20:33:55.32
一つでもあればループ内を実行して、(それ以上)無ければ抜ける。
だから、(最初から)無ければそのまま抜けて欲しいな、と。
該当するものが無いのだからループ内を実行するのは無意味だし。
0435名無しさん@お腹いっぱい。
垢版 |
2021/06/06(日) 22:14:34.25
標準出力の速度を制限したり、通信速度を表示するコマンドを探しています。どなたか知りませんか?
0437名無しさん@お腹いっぱい。
垢版 |
2021/06/07(月) 11:25:09.09
>>436
ありがとうございました!
 
0438名無しさん@お腹いっぱい。
垢版 |
2021/06/15(火) 00:01:20.06
sed の 's/foo/bar/'
スラッシュ直前の【s】って何の意味でしょうか?
g:global
i:ignore
のような意味ありますか?

またman以外でこのような略語を調べるサイトなどありますでしょうか?
0440名無しさん@お腹いっぱい。
垢版 |
2021/06/15(火) 01:15:20.43
>>439
ありがとうございます
0441名無しさん@お腹いっぱい。
垢版 |
2021/06/15(火) 11:14:03.04
edコマンドで気になってるのはv
versed subst?
でもversedって多分古語だしなあ…
exec grep -v "$@"にvrepと名付けることにした
0443名無しさん@お腹いっぱい。
垢版 |
2021/07/28(水) 19:08:57.09
_数字列_数字列_数字列_を含む文字列から先頭の数字列だけを取り出したいので
前段階としてそれより前の部分を切り出すために
echo ${文字列%_*[0-9]_*[0-9]_*[0-9]_*}
としてみたのですが、
aaa_bbb_ccc_ddd_eee_123_4_567_xxxxx_123yyy_4f6_789c_zzz
の場合には aaa_bbb_ccc_ddd_eee ではなく aaa_bbb_ccc_ddd_eee_123 になってしまいます。
どうすればいいでしょうか?
0446名無しさん@お腹いっぱい。
垢版 |
2021/07/30(金) 07:50:18.18
>>443
そうなるように書いていますけど?
0447名無しさん@お腹いっぱい。
垢版 |
2021/07/30(金) 07:51:44.84
彼はsubstringの概念がないんでしょうかね。
0450名無しさん@お腹いっぱい。
垢版 |
2021/08/08(日) 22:07:53.75
>>443
こんな感じでいけるんでね?前段階の話すっ飛ばして答えだけど
テストしてないので動かなくても知らん

isnum() {
  case "$1" in
    *[!0-9]*) return 1 ;;
    *) return 0 ;;
  esac
}
str="aaa_bbb_ccc_ddd_eee_123_4_567_xxxxx_123yyy_4f6_789c_zzz"
IFS="_"
set -- $str
while [ "$#" -gt 0 ]; do
  if isnum "$1" && isnum "$2" && isnum "$3"; then
    echo "$1"
  fi
  shift
done
0451名無しさん@お腹いっぱい。
垢版 |
2021/08/08(日) 22:24:57.80
>>445のいうように、sedで一行それも大したことない正規表現で済むな
シェルスクリプトだけという課題の制限でもなければ
0452名無しさん@お腹いっぱい。
垢版 |
2021/08/09(月) 01:15:27.49
シェルスクリプトで無理といった途端
シェルスクリプトの実装が出てきたんで
慌てて取り繕ったか?w
0454名無しさん@お腹いっぱい。
垢版 |
2021/08/09(月) 13:03:23.04
俺は面白いと思うぞ、やりたくないけどな

bashやzshならパターンの否定が使えるextglobオプション+%パラメータ展開を使うのが多分一番楽かと
0456名無しさん@お腹いっぱい。
垢版 |
2021/08/31(火) 05:29:27.62
引数を表示するのに
echo $1
だけのスクリプトファイルを作って実行するのですが
なぜか引数が1&2等の場合にうまくいきません
0460名無しさん@お腹いっぱい。
垢版 |
2021/08/31(火) 12:07:22.10
単に
sh scriptfile.sh 1&2
ってやってしまってるだけじゃないの
呼び出す側の問題
echoで展開後に&が問題になることはないのでクォートしなくても問題にはならない。クォートした方がいいけど
0465名無しさん@お腹いっぱい。
垢版 |
2021/09/02(木) 16:02:37.40
コマンド展開で質問。

echo $(...) | sed ...
みたいなスクリプトで、$(...)内のコマンドが失敗したとき、そこでエラー終了してほしいんだけど、ムリ?

set -eしても、これには効果がないもよう。
0467名無しさん@お腹いっぱい。
垢版 |
2021/09/02(木) 17:47:03.78
>コマンド置換ではムリだねえ
コマンドの引数にあるのはね
コマンド置換でも変数に入れるだけなら終了ステータス返る/見れる=-eなら止まる。そっちはやってるとかあるだろうけど、いちおう
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況