저는 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"