成功したら、2つのフォルダを同期し、ある場所から別の場所にファイルをコピーします。

成功したら、2つのフォルダを同期し、ある場所から別の場所にファイルをコピーします。

rsyncコマンドを使用して2つのフォルダを同期しており、rysncが成功した場合はファイルを正常にコピーしてコピーするときにSuccess_FolderNameなどのソースフォルダ名パラメータを追加したいと思います。私は $(basename !:3) を使用して、フォルダ名の 3 番目のパラメータを取得しました。

bash /Sync.sh 10_03_2016

#! /bin/bash

set -o history
set -o histexpand
/usr/bin/rsync -avh -r /Source/$1 /Destination/
rsyncStatus=$?
folderParam=$(basename !:3)
if($rsyncStatus==0)
then
   cp /Status/Sucesss   /Result/Success_$folderParam
else
    cp /Status/Failure   /Result/Failure_$folderParam
if

出力

間違い

/Sync.sh: line 7: :3: bad word specifier 

ファイルは「Success_」にコピーされます。

答え1

なぜ仕事をそんなに複雑にするのか理解できません。!:N必要なすべてをすでにパラメータとして渡していますが、なぜ(ややトリッキーな)履歴拡張機能を使用するのですか?たとえば、

#! /bin/bash

source="/Source/$1"
destination="Destination/"
folderParam="$(basename "$source")"
/usr/bin/rsync -avh -r "$source" "$destination"
rsyncStatus=$?
if($rsyncStatus==0)
then
   cp /Status/Sucesss   /Result/Success_"$folderParam"
else
    cp /Status/Failure   /Result/Failure_"$folderParam"
if

またはより簡単に:

#! /bin/bash

source="/Source/$1"
destination="Destination/"
folderParam="$(basename "$source")"
if /usr/bin/rsync -avh -r "$source" "$destination"; then
   cp /Status/Sucesss   /Result/Success_"$folderParam"
else
    cp /Status/Failure   /Result/Failure_"$folderParam"
if

でも:

#! /bin/bash

source="/Source/$1"
destination="Destination/"
folderParam="$(basename "$source")"
touch "/Result/Failure_$folderParam"
/usr/bin/rsync -avh -r "$source" "$destination" && 
    mv /Result/Failure_"$folderParam" /Result/Success_"$folderParam"

答え2

特別な回答より良いですが、本当に履歴演算子を使用したい場合は、参照するコマンドを指定できます。

!rsync:3

rsync最後の呼び出しの3番目のパラメータに置き換えられます。だからあなたに関する限り、

folderParam=$(basename !rsync:3)

関連情報