Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Variable containing multiple args with quotes in Bash

I generate a bash variable containing all my args and those args contain spaces. When I launch a command with those args - eg. ls $args - quotes are not correctly interpreted. Here is an example - also creating and erasing needed files.

#!/bin/bash f1="file n1" f2="file n2" # create files touch "$f1" "$f2" # concatenate arguments args="\"$f1\" \"$f2\"" # Print arguments, then launch 'ls' command echo "arguments :" $args ls $args # delete files rm "$f1" "$f2" 

With that, I have some "no such file" errors for "file, n1", "file and n2"

like image 978
hibou Avatar asked Sep 17 '11 11:09

hibou


People also ask

What does [- Z $1 mean in bash?

$1 means an input argument and -z means non-defined or empty. You're testing whether an input argument to the script was defined when running the script. Follow this answer to receive notifications.

What is $@ in bash?

bash [filename] runs the commands saved in a file. $@ refers to all of a shell script's command-line arguments. $1 , $2 , etc., refer to the first command-line argument, the second command-line argument, etc. Place variables in quotes if the values might have spaces in them.

What does $# in bash mean?

$# is the number of positional parameters passed to the script, shell, or shell function. This is because, while a shell function is running, the positional parameters are temporarily replaced with the arguments to the function. This lets functions accept and use their own positional parameters.


1 Answers

You might consider using an array for the args, something like this:

args=( "$f1" "$f2" ) ls "${args[@]}" 

(The problem you're hitting at the moment is that once interpolation has happened there's no difference between intra- and inter- filename spaces.)

like image 123
martin clayton Avatar answered Oct 26 '22 20:10

martin clayton