繁体   English   中英

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

[英]passing arguments with special characters to a function in shell script

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

my_proj -x build

但是该函数将整个字符串作为一个参数my_proj -x build而不是给我$1 = my_proj, $2=-x, $3=build ,因此我可以根据参数进行一些操作。

关于如何使Shell脚本具有这种行为的任何建议?

编辑:这是代码段(从OP的注释中添加):

lines=cat $1 
IFS=$'\n' 
for line in $lines; do 
    echo "starting build for $line"
    if [ -z "$line" ] 
    then 
        continue 
    fi 
    runBuild $line
done

您的注释中显示的代码相当曲折。 您遇到的问题是使用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

从您的评论来看:

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

我想你想要这个:

采用:

eval "build $var"

而不是build $var

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

而且,您不应该使用cat and for循环从文件中读取行。

而是使用while循环:

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

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

调用函数时,请勿在双引号中传递参数,在这种情况下,带空格的整个字符串将被视为单个实体。

而不是不加双引号

测试

$ 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, ,

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM