[過去ログ] シェルスクリプト総合 その28 (620レス)
上下前次1-新
抽出解除 レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
167: 名無しさん@お腹いっぱい。 [sage] 2020/01/20(月) 15:09:31.95 AAS
>>164164(4): 名無しさん@お腹いっぱい。 [] 2020/01/20(月) 04:38:26.60 AAS
怒らないで教えて欲しいんだけど何でお前らPowerShell使わないの?
今やPowerShellの方が勉強会でドヤれるしちょまどなんかもPowerShellだってよ
linux のコマンド群が使えないから
286(2): 名無しさん@お腹いっぱい。 [sage] 2021/04/01(木) 00:40:09.95 AAS
Windowsでシェルスクリプト動かそうとすると、パスの\のエスケープで気が狂いそうになるから
その辺捨てたパワーシェルの割り切りは、それはそれで理解できるけどなー
416: 名無しさん@お腹いっぱい。 [sage] 2021/05/22(土) 22:35:09.95 AAS
>>414414(1): 名無しさん@お腹いっぱい。 [sage] 2021/05/22(土) 22:12:21.51 AAS
例えば歯抜け連番名ファイルを詰めて連番にする場合
for f in renban* ; do
mv $f 新ファイル名
done
とやると、該当ファイルが0個でもループ内の mv を実行しようとしてエラーになります。
ループ前に該当ファイルの有無のチェックが不要な方法はないでしょうか?
たぶんrenban*がfに入るってるよね
モダンなシェルならsetで好きな挙動選べるよ
(bashならnullglobとかglobfailとか)
ただ、わざわざその一文の為にオプションいじくるよりは普通にチェックした方がいいと思うよ
たまにおまじない書き忘れて頭ひねったりするから
488: 名無しさん@お腹いっぱい。 [sage] 2021/11/04(木) 20:48:41.95 AAS
481です
いろいろな方法について情報ありがとうございます
参考にさせていただき、取り入れていこうと思います
501: 名無しさん@お腹いっぱい。 [sage] 2021/11/21(日) 22:35:21.95 AAS
>>489489(6): 名無しさん@お腹いっぱい。 [sage] 2021/11/19(金) 02:41:59.96 AAS
特定の文字列で始まるファイルが存在するかの判断はどうすればいいでしょうか
ぐぐって見つけた ls を使う方法
if ls $f* > /dev/null 2>&1
then
echo $f で始まるファイルがあります
fi
だと該当ファイルが存在しない場合に
...にアクセスできません: そのようなファイルやディレクトリはありません
というエラーメッセージが表示されます。
また、
for g in $f* ; do
echo $f で始まるファイル $g があります
done
だと該当ファイルがない場合でもループの中に入ってしまいます。
check() {
set -- "$1"*
[ -e "$1" ]
}
最短だとこうかな?
set -- "$1"* でシェルのglob展開を用いて位置パラメーターにセットする
ファイルが見つかった場合、そのファイル名が$1に入る
ファイルが見つからなかった場合、"$1"*という文字列が入る
まずありえないとは思うけど"$1*"という名前にアスタリスクが含まれた
ファイルがある可能性を考えると>>492492(2): 名無しさん@お腹いっぱい。 [sage] 2021/11/19(金) 10:51:08.20 AAS
>>489
あと、forの場合は、シェルが対象がなくてglob展開できない場合はglobそのままの値となる。forの場合に限らずglobはそういうもの
for g in $f*
の場合は、g が $f* になるので、展開されずにそのままなのかチェックするのは必要
for g in $f*; do
[ "$g" = "$f*" ] && { echo 展開できませんでした; break; }
な感じで
よりも-eでチェックした方が良い
と>>494494(1): 名無しさん@お腹いっぱい。 [sage] 2021/11/19(金) 11:07:42.62 AAS
>>492
ああ、念のためには元globとの比較ではなくて -e する方がいいな
[ "$g" = "$f*" ]
でなくて
[ -e "$g" ]
で書いてあったかw
>>493
> >>489のls使ってる方が見た目なにしたいのかわかりやすいと思うけど
ls $f* は意味がない。シェルのglob展開されてからlsを実行してる。
つまりls file1 file2 file3 のようなものを実行してるだけ。
呼び出す前にすでにファイル一覧を取得してる
単に呼び出しコストが高い[ -e ] になってる
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.285s*