ファイルを繰り返していくつかの操作を実行するスクリプトがあります。文字列の置き換え日付を挿入してください。
#!/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