- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的任务是编写一个脚本来分析代码,并附上与正确语句相对应的 #Loop
n 或 #Selection n
注释。
echo "enter full file name: "
read file
getArray(){
arr=()
while IFS= read -r line
do
arr+=("$line")
done < "$1"
}
getArray $file
echo "What file looks like before editing"
printf "%s\n" "${arr[@]}" #Test function to see if array works (it does)
#Declare variables
x=1
y=1
#Start main loop
for (( i=0; i<${#arr[@]}; i++ ));
do
if [[ "${arr[$i]}" == "while" ]] || [[ "${arr[$i]}" == "until" ]]
then sed -i 's/$/ #Loop'$x'/' $file && let "x++"
continue
elif [[ "${arr[$i]}" == "for" ]]
then sed -i 's/$/ #Loop'$x'/' $file && let "x++"
continue
elif [[ "${arr[$i]}" == "break" ]] || [[ "${arr[$i]}" == "done" ]]
then sed -i 's/$/ #Loop'$x'/' $file && let "x--"
continue
elif [[ "${arr[$i]}" == "if" ]] || [[ "${arr[$i]}" == "case" ]]
then sed -i 's/$/ #Selection'$y'/' $file && let "y++"
continue
elif [[ "${arr[$i]}" == "fi" ]] || [[ "${arr[$i]}" == "esac" ]]
then sed -i 's/$/ #Selection'$y'/' $file && let "y--"
continue
else
continue
fi
done < $file
显然,我是 bash 的新手,我的循环逻辑/语言使用可能有点不稳定。谁能帮忙?现在,输出使我似乎不止一次遍历数组,并且 Sed 每行 append 额外的文本。
如果不清楚:每个数组元素都是一行字符串;如果数组元素包含 while ||对于|| until
然后它添加一个 #loop n
并且对于每个相应的 break
或 done
,它添加相同的 #loop n
。同样对于 if
和 case
和 fi
esac
除了它添加 #selection n
.
示例输入:
Before
Final=$(date -d "2016-12-15 14:00" "+%j")
while true ; do
Today=$(date "+%j")
Days=$((Final - Today))
if (( Days >= 14 )) ; then
echo party
elif (( Days >= 2 )) ; then
echo study
elif (( Days == 1 )) ; then
for Count in 1 2 3
do
echo panic
done
else
break
fi
sleep 8h
done
预期输出:
After
Final=$(date -d "2016-12-15 14:00" "+%j")
while true ; do # loop 1
Today=$(date "+%j")
Days=$((Final - Today))
if (( Days >= 14 )) ; then # selection 1
echo party
elif (( Days >= 2 )) ; then
echo study
elif (( Days == 1 )) ; then
for Count in 1 2 3 # loop 2
do
echo panic
done # loop 2
else
break
fi # selection 1
sleep 8h
done # loop 1
最佳答案
Right now the output makes it seem like I am iterating through the array more than once and Sed appends additional text per line.
这是因为要 append 到一行的注释被 append 到文件的每一行,因为没有为脚本中的 sed
替换命令指定行号。肯定有更有效的解决方案,但在前面加上相应的行号就足够了。
虽然您的脚本非常接近工作,但还有两个问题需要解决。一个是你用来测试关键字的 ==
表达式只有在整行只包含关键字(甚至没有前导空格)时才匹配;要允许缩进,使用适当的正则表达式的 =~
很有用。另一个问题是嵌套深度的计算(包括简单但特殊的break
,深度保持不变);如果我们从深度 0
开始,这似乎更容易。因此,您的主循环可能是:
x=0
y=0
#Start main loop
for (( i=0; i<${#arr[@]}; i++ ))
do let l=1+i # line numbers start at 1
if [[ "${arr[$i]}" =~ ^[$IFS]*(while|until|for) ]]
then sed -i $l"s/$/ #Loop$((++x))/" $file
elif [[ "${arr[$i]}" =~ ^[$IFS]*break ]]
then sed -i $l"s/$/ #Loop$x/" $file # no x-- here!
elif [[ "${arr[$i]}" =~ ^[$IFS]*done ]]
then sed -i $l"s/$/ #Loop$((x--))/" $file
elif [[ "${arr[$i]}" =~ ^[$IFS]*(if|case) ]]
then sed -i $l"s/$/ #Selection$((++y))/" $file
elif [[ "${arr[$i]}" =~ ^[$IFS]*(fi|esac) ]]
then sed -i $l"s/$/ #Selection$((y--))/" $file
fi
done <$file
关于arrays - Bash,如何遍历数组一次并 append 到行尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41034146/
我是一名优秀的程序员,十分优秀!