Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 目录名Bash中的空格_Linux_Bash_Directory - Fatal编程技术网

Linux 目录名Bash中的空格

Linux 目录名Bash中的空格,linux,bash,directory,Linux,Bash,Directory,我是bash新手,正在编写一个脚本,该脚本遍历tar.gz文件归档文件,并在每个文件中将指定的字符串更改为另一个字符串。脚本的参数:存档名称、搜索字符串、目标词。 我的问题是,当存档名称包含空格时(例如,我使用以下参数运行脚本:>change_strings.sh”/tmp/tmp.m7xYn5EQ2y/work/data txt“a),我出现以下错误: 在线if[!-f$filename];然后[:数据:应为二进制运算符,dirname:额外操作数'txt'。 这是我的密码: #!/bin

我是bash新手,正在编写一个脚本,该脚本遍历tar.gz文件归档文件,并在每个文件中将指定的字符串更改为另一个字符串。脚本的参数:存档名称、搜索字符串、目标词。 我的问题是,当存档名称包含空格时(例如,我使用以下参数运行脚本:>change_strings.sh”/tmp/tmp.m7xYn5EQ2y/work/data txt“a),我出现以下错误: 在线
if[!-f$filename];然后
[:数据:应为二进制运算符,dirname:额外操作数'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

正确的处理方法是用双引号将变量括起来

var=/foo/bar baz
CMD $var # CMD /foo/bar baz
上述代码将在/foo/bar和baz上执行CMD

CMD "$var"

这将在“/foo/bar baz”上执行CMD。最好的做法是在大多数地方始终用双引号括住变量。

欢迎使用stackoverflow

为了方便当前和未来的读者,以下是一个显示问题的示例:

filename="my file.txt"
if [ ! -f $filename ]
then
    echo "file does not exist"
fi
以下是我们得到的输出:

$ bash file
file: line 2: [: my: binary operator expected
这是我们期望得到的结果:

file does not exist
为什么它们不一样


关于这件事,我要说的是:

$ shellcheck file
In file line 2:
if [ -f $filename ]
        ^-- SC2086: Double quote to prevent globbing and word splitting.
事实上,如果我们将其加倍报价,我们将获得预期的产出:

$ cat file
filename="my file.txt"
if [ ! -f "$filename" ]
then
    echo "file does not exist"
fi

$ bash file
file does not exist
你应该是

但是,您必须小心处理
$FILES
,因为它包含一个glob/通配符,您希望将其与不希望wordsplit的潜在空格一起展开。最简单的方法是不将其放入变量中,而是将其写出:

for f in "$dir"/*
do
  ...
交叉张贴: