X



シェルスクリプト総合 その29
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん垢版2018/08/25(土) 19:49:00.43ID:9FNycoly
シェルスクリプト・ バッチファイル・コマンドプロシージャなどの
シェルで使われてる言語に関する総合スレッドです。

全般
・荒しは無視しましょう。
・丁寧な姿勢を心掛けましょう。
・ネチケット(死語)を意識しましょう。

関連スレ
【.cmd】 バッチファイルスクリプト %12 【.bat】©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1489207631/

前スレ シェルスクリプト総合 その28
https://mevius.5ch.net/test/read.cgi/tech/1532397676/
0002デフォルトの名無しさん垢版2018/08/25(土) 19:51:08.05ID:9FNycoly
お約束
・シェルスクリプト・バッチファイル・PowerShell・コマンドプロシージャなどのシェルで動く言語のスレです
 Bourne ShellもしくはPOSIX準拠のsh可換シェルの場合はそのように明記してください
 特定のシェル(cmd, bash, zsh, ksh, (d)ash, yash, posh, fish, (t)csh)などの専用機能に依存する場合は明示しましょう。
  OS X, GNU/Linuxユーザーは/bin/shの実体がbashなので*特に*注意(自覚なきbashism---シバンが#!/bin/shなのにbashに依存する構文を使っていませんか?)。
   ただしDebian, Ubuntuなどでは/bin/shの実体はPOSIX sh互換のdashですのであまり気にしないでも大丈夫です。
  FreeBSDユーザーは/bin/shの実体がashなので注意。
  Solaris, OpenBSDユーザーは/bin/shの実体がkshなので注意。
 csh/tcshでのシェルスクリプトは*まったく推奨しません*。
  (参考URL: http://www.speech-lab.org/~hiroki/csh-whynot.euc)
・sh系の場合はPOSIXに準拠しましょう
 有用なリンクはhttps://en.wikipedia.org/wiki/POSIXにまとめられています。
 最新の仕様はこちらへ: http://pubs.opengroup.org/onlinepubs/9699919799/
  (左上の「Shell & Utilities」から各コマンドやファイルの仕様を参照することができます)
・Version 7 UNIXのsh(1)に一番近いのはOpenSolaris由来のHeirloom sh、次点でDebianなどに搭載されているDash shell
  Heirloom sh: http://heirloom.sourceforge.net/sh.html
  Dash shell: http://gondor.apana.org.au/~herbert/dash/
・UNIXにはシェルスクリプトに便利な小さなコマンドがいろいろあります
 Manページや各種リンク(http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.htmlなど)を見ましょう。
 apropos(1)ないしはman(1)の-kオプションでそれらしい単語による簡単な検索もできます。
・ワイルドカードは正規表現ではありません。
 正規表現の話題はスレ違い(正規表現スレへ)
・シェルスクリプトのことをシェルってゆうな
0006デフォルトの名無しさん垢版2018/12/23(日) 08:00:40.84ID:W0WvAA71
sedだと簡単に動く一文字以上の半角スペースを一文字スペースに置換するコレ
echo "$strings" | sed -E 's/ {1,}/ /g'
bashだとどーしてもうまく動かず次のように[]で囲ってやるとなんとか全連続スペースじゃなく一部
だけが置換できた。
${strings// [ \{1,\}]/ }
それ以上どうしようもなかったので、次のような関数を作った
function Rep2One(){
local str=$1
local chr=$2
while :
do
str="${str//$chr$chr/$chr}"
if [[ ! $str =~ $chr$chr ]]; then
break
fi
done
echo "$str"
}

srings=`Rep2One "$strings" " "`

これで任意の2文字以上の連続を1文字に置換できたが、
sedみたいに一発でかっこよく記述できない?
至る所でbashからsedやgrep起動してたんだが、
bashのなかでできることはbashだけでやった方が大分速いことがわかったんで
なんとかbashの正規表現だけでやりたい
00076垢版2018/12/23(日) 08:07:43.66ID:W0WvAA71
すみません前スレに移動します
0008デフォルトの名無しさん垢版2018/12/23(日) 08:14:13.74ID:yUjQiXy1
なんでそんなに正規表現に拘るのかわからん

#!/bin/sh
while IFS= read -r line; do
echo $line
done
0012デフォルトの名無しさん垢版2019/02/08(金) 15:46:28.45ID:mhRJFjKM
win10にMSYS2入れてみた

bashバッチ作ってcd `dirname $0`書いて実行したら
Cドライブだと動くのに、Dドライブで実行すると動かん

あとなぜかlookの検索が効かない
0014デフォルトの名無しさん垢版2019/02/08(金) 23:25:25.51ID:0dQnaPPd
dirname コマンドや、環境変数、$0 の意味でも調べれば?
0015デフォルトの名無しさん垢版2019/02/22(金) 19:14:15.85ID:iyc3D5GM
awkで、リダイレクト先のファイルが存在するかどうかの判別は、
どうやって書いたら良いですか?
0017デフォルトの名無しさん垢版2019/02/23(土) 13:41:37.65ID:9pS68leH
getlineは入力だよな?出力の話してるんじゃないの?
0019デフォルトの名無しさん垢版2019/02/23(土) 14:45:51.45ID:DQY5g4De
file_name="a.txt"

if [ -f "$file_name" ]
then
exit 1
fi

上のように、ファイルがあるかどうかを、BEGIN { } に書けば?

終了コード0 は正常終了で、
1以上の終了コードは、異常終了
0020デフォルトの名無しさん垢版2019/02/23(土) 17:02:38.24ID:Y0E0nwid
>>19
awkスクリプトの中だけで完結したいんです。具体的には

getline a < "/dev/stdin";
fn = a".txt"

とファイル名を作ったあとに、そのファイルがあるかどうかを確認したいんです。
ファイルがあったら処理終了、無ければ以後の処理をそのファイルにリダイレクトする処理に進む、という感じです。
0021デフォルトの名無しさん垢版2019/02/23(土) 17:21:30.63ID:jjr+o1Vg
awkコマンドの出力をリダイレクトでファイルへにしてたら、awkコマンド実行時にはすでにファイルは作られてるんじゃね。シェルによるかもしれんが
0023デフォルトの名無しさん垢版2019/02/23(土) 17:39:27.76ID:Y0E0nwid
すいません、awkスレ無いと勘違いしてました。awkスレで聞いてみます。ありがとうございました。
0024デフォルトの名無しさん垢版2019/05/04(土) 11:59:20.98ID:ml9ghwy4
保守必要?
0025デフォルトの名無しさん垢版2020/05/24(日) 14:41:24.17ID:FoupM25w
もう1年も書き込みがないのか
ヤマトならイスカンダルまで行って帰ってくれるぞ
0027デフォルトの名無しさん垢版2020/06/23(火) 21:29:06.93ID:5POR+uA5
ここは放置プレイスレ
■ このスレッドは過去ログ倉庫に格納されています

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