shell脚本中的变量插值

Dan*_*one 7 bash shell-script

我为 pg 备份编写了以下 shell 脚本:

#!/bin/bash

PG_USER=donato
DATABASE=mydb
SERVER=216.58.219.174
DIR="$HOME/pg_bak"
DATE=$(date +"%m_%d_%y")
FILE="$DATABASE_$DATE"
ERROR_FILE="$HOME/pg_bak/error_bak/$FILE_error.txt"
# pass @ .pgpass

PG_BAK_NOW () {
  pg_dump -h $SERVER -U $PG_USER $DATABASE >$FILE 2>$ERROR_FILE
  code=$?
  if [ $code -ne 0 ]; then
    echo 1>&2 "The backup failed (exit code $code), check for errors in $ERROR_FILE"
  fi
}

echo "Ready to dump to $FILE" >> "$HOME/pg_status" 

cd $DIR
if [ -f "$FILE" ];
then
  rm $FILE
  PG_BAK_NOW 
else
  PG_BAK_NOW
fi
Run Code Online (Sandbox Code Playgroud)

当我执行它时,我知道它会执行一段时间:

$ pgrep -fl pg_bak.sh
4603 pg_bak.sh
Run Code Online (Sandbox Code Playgroud)

但随后它确实崩溃了:

$ ./pg_bak.sh
The backup failed (exit code 1), check for errors in /home/viggy/pg_bak/error_bak/.txt
Run Code Online (Sandbox Code Playgroud)

注意.txt部分。错误文件的名称应该是mydb_6_11_2016_error.txt,而不是.txt. 为什么 bash 脚本没有插入变量 $FILE 和硬编码字符串“_error”?它确实在转储文件中正确插入了 $FILE,但没有正确插入错误文件。为什么?

jll*_*gre 10

一个很常见的错误。这是缺少花括号:

ERROR_FILE="$HOME/pg_bak/error_bak/$FILE_error.txt"
Run Code Online (Sandbox Code Playgroud)

并通过以下方式修复:

ERROR_FILE="$HOME/pg_bak/error_bak/${FILE}_error.txt"
Run Code Online (Sandbox Code Playgroud)