bash - 交互式地逐行更改

bash - 交互式地逐行更改

我是 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!"

相关内容