如何将带有特殊字符和空格的参数传递给C-Shell脚本

klsxnrf1  于 2023-06-24  发布在  Shell
关注(0)|答案(1)|浏览(136)

我正在写一个通用命令执行器shell脚本generic_script.csh。基本上它包含:

#!/usr/bin/csh -f

foreach x ("$argv")
   $x 
end

用法:generic_script.csh "ls -l" "groups" "mkdir /tmp/abc"
预期输出:按顺序执行参数中的命令。
问题:当我在foreach循环中解析$argv时,
1.如果我使用$argv,参数将被空格分隔:

ls
-l
groups
mkdir
/tmp/abc

1.如果我使用"$argv",则$x值为ls -l groups mkdir /tmp/abc
如何根据“”拆分参数,即

ls -l
groups
mkdir /tmp/abc

先谢谢你了!

jgzswidk

jgzswidk1#

数组argv有正确的元素,只是foreach语法将它们分开了。但是,使用$argv[3]获取元素将有效。
这迫使我们循环从1到$#argv的数字。
据我所知,我们正在做以下事情:

set i=1
while ($i <= $#argv)
    echo "i=$i"
    echo "$argv[$i]"
    @ i = $i + 1
end

它给出以下输出

$ csh test.csh a b "C D E"
i=1
a
i=2
b
i=3
C D E

因为你的例子看起来像一个任意长度的列表,你需要有一个实际的循环,而不是使用$1$2,...但在另一个环境中,你可以使用它们,它们不会被拆分:

echo "1: $1"
echo "2: $2"
echo "3: $3"
csh test.csh a b "C D E"
1: a
2: b
3: C D E

我正在准备BASH中的测试问题,但刚刚了解到它们需要在bash,ksh,sh,csh中的任何一个中可行。现在我知道csh不做函数了……太好了!

相关问题