Лучший способ справиться с передачей аргументов вложенным вызовам скриптов и созданием эффективного меню - PullRequest
0 голосов
/ 03 ноября 2019

Я пишу центральный скрипт, который действует как меню, управляемое клиентом, через который я запускаю другие скрипты на основе ввода.

#!/bin/bash

echo "Server Name - `hostname`"
echo "-------------------------------"
echo "     M A I N - M E N U"
echo "-------------------------------"
echo "1. init"
echo "2. insert"
echo "3. show"
echo "4. update"
echo "5. rm"
echo "6. ls"
echo "7. shutdown -> shutdown the server"

while :
do
    printf '> '
    read -r varname
    set -- $varname

    case $1 in
        init)
            ./init.sh $2
            echo $status
            ;;
        insert)
            ./insert.sh $2 $3 '' $4
            ;;
        show)
            ./show.sh $2 $3
            ;;
        update)
            ./insert.sh $2 $3 'f' $4
            ;;
        rm)
            ./rm.sh $2 $3
            ;;
        ls)
            ./ls.sh $2 $3
            ;;
        shutdown)
            exit 0
            ;;
        exit)
            exit 0
            ;;
        *)
            #echo "Error: Bad request"
            ;;
    esac

done

Ток:

Я специально добавилвыведите оператор '>', чтобы получить интерактивный интерфейс, подобный узлу cli.

insert user1 google 'login: blahblah@gmail.com \ npass: blah'

  • $ 1 - это вставка
  • $ 2 - это пользователь1
  • $ 3 - это Google
  • $ 4 - это 'login: blahblah@gmail.com \ npass: blah'

Ожидается:

Я хочу читать аргументы так же, как мы передаем аргументы при запуске скрипта.

Пример:

sh add. sh 10 20 или sh add.sh "10" "20"

В любом случае, когда мы читаем $ 1 или $ 2 в сценарии оболочки add , мыбудут получать значения 10 и 20.

insert user1 google 'login: blahblah@gmail.com \ npass: blah'

  • $ 1 - вставить
  • $ 2 - это user1
  • $ 3 - это google
  • $ 4 - это логин: blahblah@gmail.com \ npass: blah

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

PS: Пожалуйста, предложите, как получить cli точно так же, как узел, который имеет доступ к ранее выполненным командам, используя стрелку вверх.

Заранее спасибо

1 Ответ

1 голос
/ 03 ноября 2019

Центральная идея здесь, кажется, вращается вокруг этих строк:

    read -r varname
    set -- $varname

Команда read читает всю строку ввода как буквенный текст (без возможности продолжения строки) и записывает его как значение переменной varname, затем эта переменная раскрывается для предоставления аргументов для встроенной функции set. Но это не эквивалентно представлению той же командной строки, что и для ввода в командной оболочке.

Особое значение имеет вопрос о том, что кавычки, возникающие из-за расширения переменных, не подлежат удалению кавычек. Кроме того, расширение скобок и тильды происходит до расширения переменных, поэтому они также не будут эффективны для вас.

То, что вы действительно хотите, - это двойное расширение. В частности, это:

eval "set -- $varname"

Обратите внимание, что eval очень опасен и подвержен эксплуатации. Например, рассмотрим, что произойдет, если пользователь введет эту команду в ваш сценарий (который должен выполняться с достаточными правами для завершения работы системы):

show pwned; rm -rf /*
...