将带有特殊字符的参数传递给shell脚本中的函数

时间:2015-06-02 05:07:53

标签: bash shell

我有一个函数,我传递这样的参数..(从文本文件中的一行读取)

my_proj -x build

但该函数将整个字符串作为一个参数$1 = my_proj, $2=-x, $3=build而不是给我lines=cat $1 IFS=$'\n' for line in $lines; do echo "starting build for $line" if [ -z "$line" ] then continue fi runBuild $line done ,因此我可以根据参数执行一些操作。

关于如何使shell脚本以这种方式运行的任何建议?

编辑:以下是代码段(从OP评论中添加):

Base64

3 个答案:

答案 0 :(得分:2)

评论中显示的代码相当曲折。你遇到的问题是你使用IFS,这会使你绊倒其他变量扩展。 IFS技术可能很有用,但它也可能很危险。在这种情况下,完全没有必要,就像你使用cat

一样

这对我有用:

#!/bin/bash

runBuild() {
    echo "\$1: $1"
    echo "\$2: $2"
    echo "\$3: $3"
}

while read line
do 
    echo "starting build for $line" 
    runBuild $line 
done < "gash.txt"

gash.txt的内容:

my_proj -x build

输出:

starting build for my_proj -x build
$1: my_proj
$2: -x
$3: build

答案 1 :(得分:1)

从你的评论来看:

  

我正在从文本文件中的一行读取命令,并在中输入行   文件是my_proj -x build现在,我的脚本将该行读入   变量&#39; var&#39;并调用函数build(){},

我想你想要这个:

使用:

eval "build $var"

而不是build $var

或者您可以更改代码以省略IFS=$'\n',以便build $var按预期工作。 ($var需要不加引号)

And you shouldn't use cat and for loop to read line from file.

而是使用while循环:

while IFS= read -r line;do
#do something
done <filepath

答案 2 :(得分:0)

区别在于您调用该函数的位置。

当你调用函数时,不要用双引号传递参数,在这种情况下,带有空格的整个字符串被视为单个实体。

而不是没有双引号的传递

<强>测试

$ fun()
> {
> echo $1, $2, $3
> }

# Calling the function without double quotes
$ fun my_proj -x build
my_proj, -x, build

# Calling the function with double quotes
$ fun "my_proj -x build"
my_proj -x build, ,
$ 

如果要将变量传递给函数

$ var="my_proj -x build"
$ fun $var
my_proj, -x, build
$ fun "$var"
my_proj -x build, ,