[英]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.