如何通过回声单选两个变量?

问题描述 投票:-1回答:2

我尝试搜索文件,并将路径和版本另存为变量,因为稍后将需要每个文件来创建目录并在所需路径中解压缩.jar。

file=$(find /home/user/Documents/test/ -path *.jar)
version=$(echo "$file" | grep -P -o '[0-9].[0-9].[0-9].[0-9]')
path=$(echo "$file" | sed 's/\(.*\)[/].*/\1/') 
newpath=$(echo "${path}/${version}")
echo "$newpath"

结果

> /home/user/Documents/test/gb0500
> /home/user/Documents/test/gb0500 /home/user/Documents/test/gb0500
> /home/user/Documents/test /home/user/Documents/test/1.3.2.0
> 1.3.2.1
> 1.3.2.2
> 1.2.0.0
> 1.3.0.0

这很有趣,它只能在一行上工作。我还尝试了什么:

file=$(find /home/v990549/Dokumente/test/ -path *.jar)
version=$(grep -P -o '[0-9].[0-9].[0-9].[0-9]')
path=$(sed 's/\(.*\)[/].*/\1/')

while read $file
do
  echo "$path$version"
done

我没有脚本编写经验。那就是我几天前想出来的。我只是在练习,试图使生活更轻松。

查找输出:

/home/user/Documents/test/gb0500/gb0500-koetlin-log4j2-web-1.3.2.0-javadoc.jar
/home/user/Documents/test/gb0500/gb0500-koetlin-log4j2-web-1.3.2.1-javadoc.jar
/home/user/Documents/test/gb0500/gb0500-koetlin-log4j2-web-1.3.2.2-javadoc.jar
/home/user/Documents/test/gb0500-co-log4j2-web-1.2.0.0-javadoc.jar
/home/user/Documents/test/gb0500-commons-log4j2-web-1.3.0.0-javadoc.jar
bash shell echo
2个回答
0
投票

由于两个变量versionpath都用换行符分隔,怎么办:

file=$(find /home/user/Documents/test/ -path *.jar)
version=$(echo "$file" | grep -P -o '[0-9].[0-9].[0-9].[0-9]')
path=$(echo "$file" | sed 's/\(.*\)[/].*/\1/')
paste -d "/" <<<"${path}" <<<"${version}"

注意,前三行已not修改。

BTW我不建议在单个变量中存储多个文件名由于一些原因,它是用换行符分隔的变量:

  • 文件名可能包含换行符。
  • 操作每行的值并不容易。例如,您可以简单地说如果path=${file%/*}仅包含一个,则第三行为file

希望这会有所帮助。


0
投票

查找,sh和PE;西方最快的枪支

find /home/user/Documents/test/ -name '*.jar' -exec sh -c '
  for pname; do
      path="${pname%/*}"
      version="${pname%"${pname##*[0-9].[0-9].[0-9].[0-9]}"}"
      version="${version#"${version%???????}"}"
      echo "$path/$version"
  done' _ {} +

我有意避免了脚本中的外部实用程序,但是如果您不喜欢这些参数扩展,可以改用grep / sed。

© www.soinside.com 2019 - 2024. All rights reserved.