【问题标题】:bash save last user input value permanently in the script itselfbash 将最后一个用户输入值永久保存在脚本本身中
【发布时间】:2012-01-10 18:38:10
【问题描述】:

是否可以将用户上次输入的变量值保存在 bash 脚本本身中,以便下次再次执行时重用该值?

例如:

#!/bin/bash
if [ -d "/opt/test" ]; then
echo "Enter path:"
read path
p=$path
else 
.....
........
fi

上面的脚本只是我想给出的一个示例(可能是错误的),如果我想将p 的值永久保存在脚本本身中以便我以后在某个地方使用它,是否可以即使重新执行该脚本,该脚本仍然存在?

编辑

我已经在使用sed 在执行时覆盖脚本中的行,这种方法有效,但这并不是所说的好习惯。替换以下答案中所述的同一文件中的行比我使用的要好得多,如下所示:

...
....
PATH=""; #This is line no 7
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"; 
name="$(basename "$(test -L "$0" && readlink "$0" || echo "$0")")";
...
if [ condition ]
fi
path=$path
sed -i '7s|.*|PATH='$path';|' $DIR/$name;

【问题讨论】:

    标签: bash variables ubuntu global-variables


    【解决方案1】:

    另一种选择是将值保存为附加到脚本文件的extended attribute。这有许多与编辑脚本内容相同的问题(权限问题、对多个用户来说很奇怪等)以及它自己的一些问题(并非所有文件系统都支持......),但恕我直言,它不是完全 em> 就像重写脚本本身一样丑陋(配置文件确实是更好的选择)。

    我不使用Linux,但我认为相关命令是这样的:

    path="$(getfattr --only-values -n "user.saved_path" "${BASH_SOURCE[0]}")"
    if [[ -z "$path" ]]; then
        read -p "Enter path:" path
        setfattr -n "user.saved_path" -v "$path" "${BASH_SOURCE[0]}"
    fi
    

    【讨论】:

    • 这实际上是一个非常好的响应,但是并不是每个发行版/文件系统都启用了扩展属性,甚至不是 fattr 实用程序来设置这些。如果决定使用这些,应该有“备份选项”。
    【解决方案2】:

    在脚本本身?可以使用 sed,但不建议这样做。

    #!/bin/bash
    
    test='0'
    
    echo "test currently is: $test";
    
    test=`expr $test + 1`
    echo "changing test to: $test"
    
    sed -i "s/test='[0-9]*'/test='$test'/" $0
    

    首选方法: 尝试将值保存在一个单独的文件中,您可以轻松地做到这一点

    myvar=`cat varfile.txt`
    

    文件中的任何内容都不在您的变量中。

    我建议使用 /tmp/ 目录来存储文件。

    【讨论】:

    • 可能会很好地提及一些不建议这样做的原因。例如:权限问题、糟糕的失败行为(截断脚本)、违反最小意外原则、不适用于多用户等。
    • @Laurence Gonsalves:+1 指出了问题,我可能面临与我正在使用的问题相同的问题(已编辑问题),因为它有时不会覆盖,有时会卡住。
    【解决方案3】:

    像这样的东西应该做要求的事情:

    #!/bin/bash
    
    ENTERED_PATH=""
    
    if [ "$ENTERED_PATH" = "" ]; then
        echo "Enter path"
        read path
        ENTERED_PATH=$path
    
        sed -i 's/ENTERED_PATH=""/ENTERED_PATH='$path'/g' $0
    fi
    

    只有在之前未定义 ENTERED_PATH 时,此脚本才会询问用户路径,并将其直接存储到当前文件的 sed 行中。

    也许一种更安全的方法是在某处编写一个配置文件,其中包含您要保存的数据并在脚本开头. data.saved 获取它。

    【讨论】:

      猜你喜欢
      • 2016-04-11
      • 1970-01-01
      • 2015-01-17
      • 1970-01-01
      • 2014-04-06
      • 2015-03-26
      • 2013-01-18
      • 2016-11-18
      • 1970-01-01
      相关资源
      最近更新 更多