gpt4 book ai didi

arrays - Bash,如何遍历数组一次并 append 到行尾?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:39 25 4
gpt4 key购买 nike

我的任务是编写一个脚本来分析代码,并附上与正确语句相对应的 #Loopn 或 #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 并且对于每个相应的 breakdone,它添加相同的 #loop n。同样对于 ifcasefi 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com