私はbashを初めて使用し、tar.gzファイルのアーカイブを通過し、指定された文字列を各ファイルの別の文字列に変更するスクリプトを作成しています。スクリプトパラメータ:アーカイブ名、検索文字列、ターゲットワード。私の問題は、アーカイブ名にスペースが含まれている場合(たとえば、次のパラメータを使用してスクリプトを実行した場合:> change_strings.sh "/tmp/tmp.m7xYn5EQ2y/work/data txt" a A)エラーが発生することです。オンラインif [ ! -f $filename ] ; then
[:data:バイナリ演算子が必要です。ディレクトリ名:追加のオペランド「txt」。これは私のコードです。
#!/bin/bash
filename="${1##*/}"
VAR="$1"
DIR=$(dirname ${VAR})
cd "$DIR"
if [ ! -f $filename ] ; then
echo "no such archive" >&2
exit 1
fi
if ! tar tf $filename &> /dev/null; then
echo "this is not .tar.gz archive" >&2
exit 1
fi
dir=`mktemp -dt 'test.XXXXXX'`
tar -xf $filename -C $dir #extract archive to dir
cd $dir #go to argument directory
FILES=$dir"/*"
for f in $FILES
do
sed -i "s/$2/$3/g" "$f"
done
tar -czf $filename * #create tar gz archive with files in current directory
mv -f $filename $cdir"/"$filename #move archive
rm -r $dir #remove tmp directory
ベストアンサー1
$filename
二重引用符で囲む必要があります。"$filename"