2017-08-05 74 views
1

我編寫了一個Bash腳本,用於將目錄的內容備份到.tar文件中。我打算將腳本更新爲更具組織性,可移植性和可共享的內容。然而,我不能在我的生活中理解我的代碼中的錯誤,在這種情況下,輸出不應將$OUTDIR更改爲與$INDIR相同的路徑。使用bash腳本備份目錄的奇怪輸出

只要將-d附加到文件命令的參數(它應該顯示腳本的實際要點中使用的字符串tar命令)來定義它自己的參數,就會發生這種情況。我已經將我的代碼的一部分重寫了兩次,我不明白爲什麼輸出每次都會有所不同。

#!/bin/bash 
# Script will only back up an accessible directories 
# Any directories that require 'sudo' will not work. 

if [[ -z $1 ]]; then     # This specifically 
    INDIR=$(pwd); debug=false;   # is the part where 
elif [[ $1 == '-d' ]]; then    # the 'debug' variable 
    debug=true;      # is tampering with 
    if [[ -z $2 ]]; then INDIR=$(pwd); # the output somehow. 
    else INDIR=$2; fi 
else 
    INDIR=$1; debug=false; fi 

if [[ -z $2 ]]; then 
    OUTDIR=$INDIR 
elif [[ '$2' = '$INDIR' ]]; then 
    if [[ -z $3 ]]; then OUTDIR=$INDIR; 
    else OUTDIR=$3; fi 
else 
    OUTDIR=$2; fi 

FILENAME=bak_$(date +%Y%m%d_%H%M).tar 
FILEPATH=$OUTDIR'/'$FILENAME 
LOGPATH=$OUTDIR'/bak.log' 

if [[ "$debug" = true ]]; then 
    echo "Input directory: "$INDIR 
    echo "Output directory: "$OUTDIR 
    echo "Output file path: "$FILEPATH 
    echo "Log file path:  "$LOGPATH 
else 
    tar --exclude=$FILEPATH --exclude=$LOGPATH \ 
    -zcvf $FILEPATH $INDIR > $LOGPATH 
fi 

這是輸出

[email protected]:~$ bakdir -d 
Input directory: /home/gnomop 
Output directory: /home/gnomop 
Output file path: /home/gnomop/bak_20170804_2123.tar 
Log file path:  /home/gnomop/bak.log 
[email protected]:~$ bakdir -d /home/other 
Input directory: /home/other 
Output directory: /home/other 
Output file path: /home/other/bak_20170804_2124.tar 
Log file path:  /home/other/bak.log 
[email protected]:~$ bakdir -d /home/other /home/other/bak 
Input directory: /home/other 
Output directory: /home/other 
Output file path: /home/other/bak_20170804_2124.tar 
Log file path:  /home/other/bak.log 

回答

1

單引號內是不允許塔變量擴大。

您需要更正這一行:

elif [[ '$2' = '$INDIR' ]]; 

這樣:

elif [[ "$2" = "$INDIR" ]]; 
+0

它工作。非常感謝你 –

0

@whoan是正確的對眼前的問題,但我建議的參數解析一個完全重寫邏輯使其更簡單。對於像-d這樣的選項,最好的辦法是檢查它(/他們),然後從shift的參數列表中刪除它們,然後設置位置參數。例如,這意味着INDIR將是$1(如果已設置)或$(pwd);沒有它的複雜性有時是$2

此外,最好在shell腳本中使用小寫(或混合大小寫)變量名稱,因爲有大量具有特殊含義的全大寫變量,並且如果您意外地使用了其中一個...壞東西可以發生。 (經典示例是嘗試將$PATH用於搜索命令的目錄列表以外的內容,此時您會發現很多「找不到命令」的錯誤。)另外,最好在所有內容中加上雙引號變量引用;有些地方他們沒有必要,但是有很多地方可能會造成奇怪的錯誤。最後,如果未設置變量,則使用備用字符串的外殼快捷方式爲:indir="${1:-$(pwd)}"將設置$indir$1(如果設置爲非空白),否則將設置爲$(pwd)

if [ "$1" = "-d" ]; then 
    debug=true 
    shift # remove -d from the argument list, to simplify parsing the positional parameters 
else 
    debug=false 
fi 

indir="${1:-$(pwd)}" 
outdir="${2:-$indir}"