Bash

字元串替換來檢測空變數?

  • August 10, 2020

我有一個腳本可以遍歷文件並進行一些字元串替換以插入日期。

#!/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

您還會遇到/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命令。

引用自:https://unix.stackexchange.com/questions/603708