Bash
字元串替換來檢測空變數?
我有一個腳本可以遍歷文件並進行一些字元串替換以插入日期。
#!/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
命令。