Я уверен, что это может быть улучшено, но я просто собрал это, чтобы позволить подсказкам в середине команд, используя подоболочки. Таким образом, в следующем простом примере он будет интерактивно запрашивать 2 параметра каждый раз, когда я его запускаю, а затем выводить этот результат.
$ echo "hi $(ask name), how $(ask old) are you?"
:name (This is a prompt. I supplied "brad" as the value)
:old (This is another prompt. I supplied "young" as the value)
hi brad, how young are you?
Если я запускаю его второй раз, он запоминает, что я дал для ввода (он сохраняет их во временном файле в /tmp
). Это можно отключить, передав "нет" в качестве второго параметра.
$ echo "hi $(ask name), how $(ask old) are you?"
:brad (This is a prompt. I supplied "parks" as the value)
:young (This is another prompt. I hit enter to use the default value)
hi parks, how young are you?
Замечания:
- Все tmp файлы можно удалить, запустив
ask clear
- Справка может быть отображена с
ask help
- Для этого требуется bash 4.x, так как
read -i
недоступно в старых версиях bash. Это должно предоставить ask значение по умолчанию. Вы можете обновить bash, используя homebrew.
Вот сценарий!
просить
#!/usr/local/bin/bash
me=$(basename "$0")
show_help()
{
it=$(cat <<EOF
Prompts you for info, allowing a default value that can also
be updated by being stored in a tmp file.
Useful for interactively replacing parts of a bash command
you're running with a new value easily, instead of having
to manually edit the command all the time.
usage: $me {default_value} {tmp_key}
e.g.
$me -> asks for input
$me HI -> asks for input, with "HI" supplied as default value.
Saves the user supplied value in a tmp file, and
uses that as the default the next time it's run
$me 1 no -> asks for input, with 1 supplied as default value.
If tmp_key is any value other than "no", will
save the user supplied value in a tmp file, and
use that as the default the next time it's run
$me clear -> removes any tmp files that have been created.
A more real example, the following will curl an url at
a site, and constantly ask you for the page you want to hit,
remembering the last value you used in a tmp file.
$ curl http://httpbin.org/\$($me somePage)
EOF
)
echo "$it"
exit
}
# Store tmp files in a folder
tmp_file_path="/tmp/__${me}"
mkdir -p "$tmp_file_path"
prompt=":"
if [ "$1" = "help" ]
then
show_help
fi
if [ "$1" = "clear" ]
then
rm -fr "$tmp_file_path"
echo "Removed any tmp files from $tmp_file_path"
exit;
fi
# Initialize our default value and tmp file name
default_value=${1:-""}
tmp_key_default=$(echo "$default_value" | head -n1 | tr -cd '[[:alnum:]]._-')
tmp_key=${2:-"no"}
if [ -n "$1" ]
then
if [ -z "$2" ]
then
tmp_key=$tmp_key_default
fi
fi
# Convert tmp_key to lower case
tmp_key=$(echo "$tmp_key" | tr '[:upper:]' '[:lower:]')
# Get the default value to prompt with
tmp_file="$tmp_file_path/$tmp_key"
if [ "$tmp_key" != "no" ]
then
if [ -f "$tmp_file" ]; then
default_value=$(cat "$tmp_file")
fi
fi
# Ask the user for input, supplying the default
read -r -e -p "$prompt" -i "$default_value" result
echo "$result"
# Save the new value to a tmp file if we're supposed to
if [ "$tmp_key" != "no" ]
then
echo "$result" > "$tmp_file"
fi