空の変数を検出するための文字列置換?

空の変数を検出するための文字列置換?

ファイルを繰り返していくつかの操作を実行するスクリプトがあります。文字列の置き換え日付を挿入してください。

#!/bin/bash
f="/tmp/file.txt" # with .txt extension
timestamp="$(date +%H%M%S)"
echo "${f%%.*}-$timestamp.${f#*.}"

以下の結果が出力されます。これは正しいです。

/tmp/file-220304.txt

ただし、ファイルに拡張子がない場合、スクリプトは中断されます。

#!/bin/bash
f="/tmp/file" # no extension
timestamp="$(date +%H%M%S)"
echo "${f%%.*}-$timestamp.${f#*.}"
$ ./test.sh
/tmp/file-220359./tmp/file

${f:-not found}空白を埋めるために定義されていない場合と同じものを使用できますか?f以下の方法では、上記の問題をどのように解決するのかわかりません。

#!/bin/bash
f="/tmp/file" # no extension
timestamp="$(date +%H%M%S)"
echo "${f%%.*}-$timestamp.${f#*.:-not found}"

結果:

$ ./test.sh
/tmp/file-221420./tmp/file

ベストアンサー1

/tmp/dir.d/fileファイルの問題も発生します。

そしてzsh

#! /bin/zsh -
f="/tmp/file.txt" # with .txt extension
timestamp=${(%):-%D{%H%M%S}}

set -o extendedglob
extension=${(M)f%.[^./]#}
print -r -- ${f%$extension}-$timestamp$extension

標準sh構文を使用してください(bash / zshでも機能します):

#! /bin/sh -
f="/tmp/file.txt" # with .txt extension
timestamp=$(date +%H%M%S)

case ${f##*/} in
  (*.*) printf '%s\n' "${f%.*}-$timestamp.${f##*.}";;
  (*)   printf '%s\n' "$f-$timestamp";;
esac

を使用すると、コマンドの実行を避けるためにbash置き換えることができます。timestamp=$(date +%H%M%S)printf -v timestamp '%(%H%M%S)T'date

おすすめ記事