【问题标题】:Passing quoted arguments to C program in a shell script在 shell 脚本中将引用的参数传递给 C 程序
【发布时间】:2013-11-20 00:49:56
【问题描述】:

我有一个 C 程序“main”,它获取以下参数:

"a b c d ..." e f g

因为是引用,所以一共是4个参数。我有一个文本文件,每行都有这 4 个参数。我制作了一个 shell 脚本来为每个参数运行 C 程序:

#!/bin/bash
while read line
do
    ./main "$line"
done < $1

问题在于 C 程序将第一个被引用的参数识别为几个单独的参数,就好像引号被忽略了一样。在我尝试过的许多事情中,值得一提的是,我尝试将文件中的每个引号更改为 \" 甚至从调用中删除引号(./main $line)。

【问题讨论】:

    标签: c shell parameters


    【解决方案1】:
    #!/bin/bash
    while read line
    do
        eval set -- $line
        ./main "$@"
    done < $1
    

    【讨论】:

    • 为什么是eval?不应该只使用set -- $line吗?
    • 参数似乎被转义了(例如"a b c d" e f),所以它们必须通过eval传递。如果您不相信我,请测试一下;)echo '"1 2 3 4" a b c' | bash -x /tmp/xxxx.sh
    • eval set -- $line 有效,谢谢。但我不太清楚为什么(我在 shell 脚本方面没有那么丰富的经验)。我的解释是: set -- $line 设置传递给 shell 的参数,出于某种我不知道的原因;然后 eval 对其进行评估,以便可以相应地解释 $line ,这将考虑到引号。那是对的吗?为什么set -- $line 设置传递给shell 的参数,即$@?还是没有?
    • eval 导致它被解释为当您键入 set -- "1 2 3 4" a b c 时。没有,它将被解释为set -- \"1 2 3 4\" a b c;例如" 是字面意思。 set 设置位置参数($@); -- 用于避免在 args 之后解释前面的 -
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多