unexpected "then" expecting "done" in dash : 如何在 dash 中的 for 循环中插入 if 条件?

unexpected "then" expecting "done" in dash : how will I insert an if condition inside a for loop in dash?

我正在使用破折号,我需要创建 CGI 脚本来解析查询字符串并将每个值保存到一个变量

OLDIFS=$IFS                
// use & as delimeter
IFS='&'

//this will loop the queryString variable               
for line in $queryString;  
do     
//check if the key = action, if the condition was satisfied it will save the line to a variable..
//if the key is equal to type etc. etc.                                                 
        echo "{$line,1}"                                                   
        if[{$line,0:7}="action="]
                then
                cgi_action={$line:8}
        elif[{$line:0:5}="type="]
                then
                cgi_type={$line:6}                                  
        fi                       
done                             
IFS=$OLDIFS        

我确定我在获取行(或字符串)的子字符串时出错,但请让我们关注我在 for 循环中放置 if 语句时遇到的错误。在 dash shell 脚本中的 for 循环中编写 if 条件的正确方法是什么。

其他信息,我正在使用 ubuntu 14.04,

首先,shell 脚本中的注释是 #,而不是 //,这意味着您的脚本在尝试解析它时会混淆破折号。

其次,你必须在 if 条件中的所有标记周围放置空格 - 这实际上是你编写它的方式的语法错误,例如将动作测试更改为:

if [ {$line,0:7} = "action=" ]

第三,dash不支持子串提取,即使支持,正确的格式是:

${variable:start}
${variable:start:nchars}

如果您想使用子字符串提取,那么您应该使用 bash 而不是 dash

第三,您在值提取的索引中遇到了一个错误 - 您正在删除字符串中的第一个字符。例如您从偏移量 0 中检查 type= 值的长度 5,然后从索引 6 中获取所有内容,这比您应该使用的要大 1。

您的代码最好阅读如下内容:

OLDIFS=$IFS
# use & as delimeter
IFS='&'

#this will loop the queryString variable
for line in $queryString; do
    #check if the key = action, if the condition was satisfied it will save the line to a variable..
    #if the key is equal to type etc. etc.

    echo "${line:1}"
    if [ ${line:0:7} = "action=" ]; then
        cgi_action=${line:7}
    elif [ ${line:0:5} = "type=" ]; then
        cgi_type=${line:5}
    fi
done
IFS=$OLDIFS

Not that I would ever recommend using shell for CGI scripting