如何在 Linux 脚本中使用带有变量的 7z?

如何在 Linux 脚本中使用带有变量的 7z?

例如:

7za e -y $file_name -o$dest_directory

当直接从命令行运行时,它工作正常,但在脚本中它会出现此错误:

无法找到档案(没有该名称的档案)。

我曾尝试使用:

7za e -y `ls -a | grep 001` -o`pwd` 

这将成功提取文件,但是当脚本结束时,文件无处可寻。

答案1

我从上面的评论中复制粘贴了您的脚本,并在符号处添加了换行符;以提高可读性:

!/bin/bash
printf "%s\n" "Please enter full path to the vmfile location e.g. /path/to - "
read
vmfile_path=$REPLY
cd $vmfile_path
7za e -y ls -a | grep 001 -o`pwd`
  • 首先,第一行应该是#!/bin/bash如果有的话,但我猜那是一个打字错误。

  • 您的read命令和后续行更容易写成read vmfile_path。 这样,shebang 实际上也可以更改为 just ,#!/bin/sh因为您不会使用任何 Bash 特定功能。

  • 您应该引用该cd参数来处理带有空格的目录名。

  • 我猜你想提取一个文件,其名称包含001最后一行的字符串。目前它缺少一些流程替换,你的意图可能更接近于:

    7za e -y $(ls -a | grep 001) -o$(pwd)
    

    与反引号相比,该$()语法更易于阅读(并且具有一些其他优点),但它的作用是相同的。

    我还猜测输出目录默认为输出pwd,从而使其成为多余的,但我不确定。

  • 如果有多个文件名匹配,您的命令将不会喜欢它001

忽略最后一个问题,你总体上想要的是类似这样的东西:

#!/bin/sh
printf '%s\n' "Please enter full path to the vmfile location e.g. /path/to - "
read vmfile_path
cd "$vmfile_path"
7za e -y "$(ls -a | grep 001)" -o"$(pwd)"

或者,更简单,将最后两行替换为(也将处理多个匹配)(尽管未经测试):

find "$vmfile_path" -maxdepth 1 -name '*001*' -exec 7za e -y -o"$vmfile_path" {} \;

如果您了解更多文件名,名称匹配模式可能会得到改进。

相关内容