如何记住shell脚本中的用户输入?

时间:2015-11-27 07:02:50

标签: bash shell

我的shell脚本中有用户设置。我该如何询问用户输入并记住它?在示例中我有代码:

ALTERNATEMEMORY="false"

我需要询问用户输入(在' configure'模式下运行脚本时):

echo "Use alternate memory?"
select yn in "true" "false"; do
    case $yn in
        Yes ) [permament save ALTERNATEMEMORY as "true"];;
        No ) [permament save ALTERNATEMEMORY as "false"];;
    esac
done

脚本应该如上所述询问用户,阅读他的输入,并根据选择设置ALTERNATEMEMORY到相应的状态。下次运行脚本(不配置,只运行)时,它应该记住该设置。我应该把这些方括号放入什么?

如果我在发帖时犯了错误,请原谅我 - 这是我第一次使用stackoverflow。

2 个答案:

答案 0 :(得分:2)

即使重新启动后,记住从一次运行到下一次运行的设置的标准方法是使用配置文件。对于系统范围的设置,这些配置文件通常位于/etc中,并且可以命名,例如/etc/myprog.conf。对于特定于用户的设置,该文件通常位于主目录中,其名称以.开头,例如$HOME/.myprog.conf。选择其中一个路径并创建配置文件:

echo "ALTERNATEMEMORY=false" >path/myprog.conf

现在,让脚本的配置部分根据需要更新该文件:

echo "Use alternate memory?"
select yn in "true" "false"; do
    case "$yn" in
        true)
           sed -i '/ALTERNATEMEMORY/ s/.*/ALTERNATEMEMORY=true/' path/myprog.conf
           break
           ;;
        false)
           sed -i '/ALTERNATEMEMORY/ s/.*/ALTERNATEMEMORY=false/' path/myprog.conf
           break
           ;;
    esac
done

在上文中,我们使用sed -i来就地更新文件。这适用于linux。如果您使用的是BSD系统(OSX),则需要在该命令中添加两个引号,如sed -i "" ...

使用任意字符串

进行替换

如果我们想将ALTERNATEMEMORY设置为值$sel,其中sel是包含任意字符的shell变量,那么我们需要在进行替换之前将它们转义。这可以完成as follows(假设shell是bash):

escaped_sel=$(sed 's/[&/\]/\\&/g' <<< "$sel")
sed -i "/ALTERNATEMEMORY/ s/.*/ALTERNATEMEMORY=$escaped_sel/" path/myprog.conf

答案 1 :(得分:0)

拥有包含以下行的mem.conf文件

UNSET
TRUE

第一行可以是SET/UNSET,用于检查用户是否已配置,第二行可以是TRUE/FALSE,以检查是否使用备用内存。

最初,第一行应设置为UNSET

然后编写脚本configure.sh,如下所示:

is_set=`head -n1 mem.conf`
if [[ $is_set == "SET" ]]
then
{
echo "Your have already configured the settings."
}
else
{
echo "Use Alternate memory?"
options=("TRUE" "FALSE" "QUIT")
select opt in "${options[@]}"
do
    case $opt in
        "TRUE")
            echo "SET" > mem.conf
            echo "TRUE" >> mem.conf
            echo "Configuration Saved !!"
            break;
            ;;
        "FALSE")
            echo "SET" > mem.conf
            echo "FALSE" >> mem.conf
            echo "Configuration Saved !!"
            break;
            ;;
        "QUIT")
            echo "Seems like you have not made up your mind yet !"
            echo "Please come back later."
            break;
            ;;
        *) echo "invalid option"
            ;;
    esac
done
}
fi
echo "Configuration File : "`pwd`"/mem.conf"

此处的优点是您可以强制编辑mem.conf从头开始。