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
我正在使用破折号,我需要创建 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