Bash: pass variable as a single parameter / shell quote parameter

穿精又带淫゛_ 提交于 2019-12-02 01:21:50

The problem seems to be inside the "program"

variable="Hello World"    # quotes are needed because of the space
./program "$variable"     # here quotes again

and inside the program

echo "program received $# arguments:" 
i=1
for arg in "$@"      # again quotes needed
do echo "arg $((i=i+1)): '$arg'"    # and again
done

did you try with var="hello world"?

i tried this in my solaris box.

> setenv var "hello world"
> cat temp.sh
#!/bin/sh

echo $1
echo $2
> ./temp.sh "$var"
hello world

>

as you can see the $2 is not printed.$var is considered as only one argument.

When you call your script pass the arguments within quotes.

Example script:

#!/bin/bash
for arg in "$@"; do
 echo "arg: $1";
 shift;
done

When you call it with:

./program "parameter with multiple words" parameter2 parameter3 "another parameter"

The output should be:

arg: parameter with multiple words
arg: parameter2
arg: parameter3
arg: another parameter

Have a look on http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html .

The problem is that the expansion of variables is done before of the command line parameters hence your behavior.

You might work it arround with setting IFS to something weird as

IFS='###' V='foo bar baz'; ./program $V 

This is almost certainly a problem in the way you are reading the variable in your program.
For instance suppose this is your script (just one line for testing):

echo "$1"

Let's call it echo.sh. If you run echo.sh "test best", you will get test best.

But if your program says

echo $1

you might get behaviour like what you're seeing.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!