在 ksh shell 脚本中考虑临时变量后解析参数

Posted

技术标签:

【中文标题】在 ksh shell 脚本中考虑临时变量后解析参数【英文标题】:Parsing arguments after taking into a temp variable in ksh shell scripting 【发布时间】:2015-05-31 17:32:41 【问题描述】:

我有一个如下的 shell 脚本:

$ cat check.sh  

    echo "$@"  
    for i in "$@"; do  
        echo "$i"  
    done   

如果我使用命令行参数运行脚本,它会打印如下:

$ ./check.sh arg1 arg2 "This is a message" arg4  

arg1 arg2 This is a message arg4  
arg1  
arg2
This is a message  
arg4  

到目前为止一切都很好.. -- 显示的参数数量为 4

如果我将$@ 放入一个变量并对其执行相同的操作,它将表现如下:

$ cat check.sh  

    VARGS="$@"  
    echo "$VARGS"  
    for i in $VARGS; do  
        echo "$i"  
    done  


$ ./check.sh arg1 arg2 "This is a message" arg4

arg1 arg2 This is a message arg4   
arg1  
arg2  
This  
is  
a  
message  
arg4  

这里参数的数量是 7。 我在临时变量中采用参数的原因是从中删除一些不需要的参数并将其传递给另一个应用程序/进程。

有人可以告诉我如何在这种情况下获得与使用“$@”相同的行为

提前感谢您的帮助。

【问题讨论】:

您需要使用数组来保存您的参数。如果您的ksh 版本不支持数组变量,那么您可能需要手动查找要避免的值的索引并使用$@:offset:length 语法手动调用第二个命令(即使没有通用数组变量也应该存在我认为)。 【参考方案1】:

我正在为此使用 ksh93,但它应该可以在 ksh88 中工作,并且它也有数组:

set -A VARGS "$@"

IFS=

for i in $VARGS[@]; do
    echo "$i"
done

设置IFS= 是必要的,否则“这是一条消息”字符串会被空格分割。

【讨论】:

以上是关于在 ksh shell 脚本中考虑临时变量后解析参数的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本中的变量及变量传参详解

孤儿(ksh Shell 脚本未在 CTRL-X 上首先终止)

KSH 使用变量中的参数运行 Java

如何让Linux终端默认的shell就是csh?

unix下KSH中shell的SED命令怎样把文件中的NULL替换成空格。 (十六进制码00替换成20)

shell脚本中的$*,$@和$#分别是啥意思?