我有一个函数,我传递这样的参数..(从文本文件中的一行读取)
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
答案 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, ,