是否可以将用户最后输入的变量值保存在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;
像这样的东西应该做要求的东西:
#!/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
在你的脚本的开始。
在脚本本身?可以使用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/dir来存储文件。
另一个选项是将值保存为附加到脚本文件的扩展属性。这有许多与编辑脚本内容相同的问题(权限问题,对多个用户来说很奇怪,等等)加上它自己的一些问题(不是所有文件系统都支持…),但在我看来,它并不像重写脚本本身那样难看(一个配置文件确实是更好的选择)。
我不使用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