我是 bash 脚本编写新手。我想创建一个交互式脚本,提示用户输入数据以逐行编辑文件。
场景: - 读取文件并迭代每一行,我使用for in
询问用户是否编辑该行
如果是,请进行编辑
如果没有,请继续下一行
一切结束后结束交互。
我的做法:
# --> get file contents and convert them to an array
readarray thearray < ips.info
# --> Iterate the array and do interactive editing
for item in ${!thearray[@]}; do
if [[ "$item" == 0 ]]; then
echo -e "First line: ${thearray[$item]}. Change this line? (y/n)"
read Useranswer
if [ $Useranswer = y]; then
echo "Please type any string:"
read Firststring
elif [ $Useranswer = n]; then
# not sure what to write here to resume
fi
fi
done
echo "Everything done!"
n
我上面的代码是否有任何错误以及如果用户按下键盘如何恢复?
答案1
你可以使用无操作命令(不执行任何操作),在 shell 中是:
elif [ $Useranswer = n]; then
:
fi
否则,您可以使用该exit
命令,该命令用于终止脚本。该命令的退出状态范围为 0-255。仅exit 0
意味着成功,其他所有退出状态代码都描述某种失败(这不是您需要的)。另外,您也可以执行以下操作:
elif [ $Useranswer = n]; then
exit 0
fi
但在这种情况下,脚本的其余部分将不会被执行,因为 exit 确实在此时终止了脚本,因此例如:如果用户按“n”,您将永远不会得到以下输出echo "Everything done!
答案2
这是我的解决方案:
# --> get file contents and convert them to an array
readarray thearray < test1
# --> Iterate the array and do interactive editing
declare i=1;
#printf "%s\n" "${thearray[@]}"
while [ $i -le ${#thearray[@]} ]; do
echo $i
echo -e "First line: ${thearray[$i]}. Change this line? (y/n)"
read Useranswer
if [ $Useranswer == "y" ]; then
echo "Please type any string:"
read Firststring
thearray[$i]="${Firststring}"
let i=$i+1
elif [ $Useranswer == "n" ]; then
let i=$i+1
echo $i
fi
done
echo "printing results\n"
printf "%s\n" "${thearray[@]}"
echo "Everything done!"
我保留了这readarray
一点,这一点非常明显并且运行良好。
然后我声明i
并将其设置为 1,它将帮助我循环进入数组。
然后我使用一个while
循环,迭代直到i
不再小于或等于 array 的大小${#thearray[@]}
。
您的语法${!thearray[@]}
不正确,因为它用于关联数组来获取整个关联值的列表。它不适用于索引数组。
然后我显示更改数组[$i]当前元素的提示。如果答案是肯定的,那么我阅读答案并将数组 [$i] 设置为该值并且我将我的i
.如果不是,我就增加 1 i
。
退出循环时,我再次显示数组以显示更改。
如果您想保存,可以将其保存回原来的状态。
答案3
我认为这会满足你的要求
#!/usr/bin/env bash
# --> get file contents and convert them to an array
readarray thearray < ips.info
# --> Iterate the array and do interactive editing
for item in ${!thearray[@]}; do
echo "Line number: "$item
echo "line contents: "${thearray[$item]}
echo -n "Change this line? (y/n)"
read Useranswer
if [ $Useranswer = y ]; then
echo -n "Please type any string:"
read Firststring
# insert new value into array
thearray[$item]=$Firststring
elif [ $Useranswer = n ]; then
# not sure what to write here to resume
:
fi
done
declare -p thearray
echo "Everything done!"