bash сохранить последнее введенное пользователем значение постоянно в самом скрипте - PullRequest
2 голосов
/ 01 декабря 2011

Возможно ли сохранить последнее введенное значение переменной пользователем в самом скрипте bash, чтобы я мог повторно использовать значение в следующий раз при повторном выполнении?.

Например:

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

Приведенный выше скрипт - это просто пример, который я хотел привести (что может быть неверно). Возможно ли, если я захочу сохранить значение p навсегда в самом скрипте, чтобы я использовал его где-нибудь позже сценарий, даже если сценарий выполняется повторно?

EDIT

Я уже использую 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;

Ответы [ 3 ]

3 голосов
/ 01 декабря 2011

Что-то вроде этого должно делать запрашиваемые вещи:

#!/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 в начале вашего сценария.

2 голосов
/ 01 декабря 2011

в самом скрипте?Да с помощью 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 для сохранения файла в.

1 голос
/ 02 декабря 2011

Другой вариант - сохранить значение в виде расширенного атрибута , прикрепленного к файлу сценария. Это имеет много тех же проблем, что и редактирование содержимого скрипта (проблемы с разрешениями, странные для нескольких пользователей и т. Д.), Плюс некоторые его собственные (не поддерживаются во всех файловых системах ...), но IMHO это не совсем такой же уродливый, как и переписывание самого скрипта (файл конфигурации действительно лучший вариант).

Я не использую 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...