[過去ログ] シェルスクリプト総合 その28 (620レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
492
(2): 名無しさん@お腹いっぱい。 [sage] 2021/11/19(金) 10:51:08.20 AAS
>>489
489(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
だと該当ファイルがない場合でもループの中に入ってしまいます。
あと、forの場合は、シェルが対象がなくてglob展開できない場合はglobそのままの値となる。forの場合に限らずglobはそういうもの
for g in $f*
の場合は、g が $f* になるので、展開されずにそのままなのかチェックするのは必要
for g in $f*; do
[ "$g" = "$f*" ] && { echo 展開できませんでした; break; }
な感じで
494
(1): 名無しさん@お腹いっぱい。 [sage] 2021/11/19(金) 11:07:42.62 AAS
>>492
ああ、念のためには元globとの比較ではなくて -e する方がいいな
[ "$g" = "$f*" ]
でなくて
[ -e "$g" ]
501: 名無しさん@お腹いっぱい。 [sage] 2021/11/21(日) 22:35:21.95 AAS
>>489
check() {
  set -- "$1"*
  [ -e "$1" ]
}

最短だとこうかな?

set -- "$1"* でシェルのglob展開を用いて位置パラメーターにセットする
ファイルが見つかった場合、そのファイル名が$1に入る
ファイルが見つからなかった場合、"$1"*という文字列が入る

まずありえないとは思うけど"$1*"という名前にアスタリスクが含まれた
ファイルがある可能性を考えると>>492よりも-eでチェックした方が良い
>>494で書いてあったかw

>>493
493(1): 名無しさん@お腹いっぱい。 [sage] 2021/11/19(金) 11:01:48.57 AAS
>forの場合に限らずglobはそういうもの
なので、
if [ "$(echo $f*)" != "$f*" ]
then
echo $f で始まるファイルがあります
fi
とかとも書ける
zshでnomatchだと余計なメッセージが出るし、>>489のls使ってる方が見た目なにしたいのかわかりやすいと思うけど、いちおう
> >>489のls使ってる方が見た目なにしたいのかわかりやすいと思うけど
ls $f* は意味がない。シェルのglob展開されてからlsを実行してる。
つまりls file1 file2 file3 のようなものを実行してるだけ。
呼び出す前にすでにファイル一覧を取得してる
単に呼び出しコストが高い[ -e ] になってる
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.036s