Search code examples
bashshellecho

How to oneline two variables via echo?


I try to search for files and seperate path and version as variable because each will be needed later for creating a directory and to unzip a .jar in desired path.

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"

result

> /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

It's hilarious that it's only working at one line. what else I tried:

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

I have no experience in scripting. Thats what I figured out some days ago. I am just practicing and trying to make life easier.

find output:

/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

Solution

  • As the both variables version and path are newline-separated, how about:

    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 "/" <(echo "$path") <(echo "$version")
    

    Result:

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

    BTW I do not recommend to store multiple filenames in a single variable as a newline-separated variable due to several reasons:

    • Filenames may contain a newline character.
    • It is not easy to manipulate the values of each line. For instance you could simply say the third line as path=${file%/*} if file contains just one.

    Hope this helps.