Как получить файл bash для эха по-разному на основе ввода пользователем?

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

find /directory ! -user username -printf "%u %p\n" 
7
задан 20 May 2018 в 09:20

9 ответов

Основная проблема здесь:

read $input

В bash обычно $foo является значением переменной foo. Здесь вам не нужно значение, но имя переменной, поэтому оно должно быть просто:

read input

Аналогично, в тестах if $yes и $no должны просто yes и no, так как вам просто нужны строки yes и no.

Здесь вы можете использовать инструкцию case, которая (IMHO) упрощает выполните несколько случаев на основе ввода:

case $input in
[Yy]es)    # The first character can be Y or y, so both Yes and yes work
    echo "Hello!"  
    echo "Hello!" | festival --tts
    ;;
[Nn]o)     # no or No
    echo "Are you sure?"
    echo "Are you sure?" | festival --tts
    ;;
*)         # Anything else
    echo "Please answer yes or no."
    echo "Please answer yes or no." | festival --tts
    ;;
esac

Вы можете обернуть два оператора echo и использовать festival в функции, чтобы избежать повторения:

textAndSpeech ()
{
    echo "$@"
    echo "$@" | festival --tts
}
case $input in
[Yy]es)    # The first character can be Y or y, so both Yes and yes work
    textAndSpeech "Hello!"  
    ;;
[Nn]o)     # no or No
    textAndSpeech "Are you sure?"
    ;;
*)         # Anything else
    textAndSpeech "Please answer yes or no."
    ;;
esac
[d5 ]

С помощью $input bash заменяет это своим значением, которое изначально ничего не происходит, поэтому запуск команды read:

read 

И read по умолчанию сохраняет вход в переменной REPLY. Таким образом, вы можете, если хотите, полностью исключить переменную input и использовать $REPLY вместо $input.

Также посмотрите на инструкцию select в Bash.

13
ответ дан 22 May 2018 в 10:35
  • 1
    Спасибо огромное! Я искал все это простое решение, но не смог его найти. Мой единственный вопрос - как я могу сделать его петлей? Например, заставьте скрипт продолжать цикл, пока пользователь не ответит «да». а не просто заканчивается после данного ответа. Спасибо огромное! – Santiago 20 May 2018 в 22:33
  • 2
    @Santiago делает цикл while true; do...done, с операцией break сразу после echo "Hello!". – Sergiy Kolodyazhnyy 20 May 2018 в 23:56
  • 3
    @Santiago - это именно то, о чем говорит select! Оператор select будет неоднократно просить пользователя выбрать один из доступных параметров, а затем на основе этих параметров вы можете решить break из инструкции select или продолжить цикл. См. Например: paste.ubuntu.com/p/Ztp3XGCKtF – Olorin 21 May 2018 в 09:20

Основная проблема здесь:

read $input

В bash обычно $foo является значением переменной foo. Здесь вам не нужно значение, но имя переменной, поэтому оно должно быть просто:

read input

Аналогично, в тестах if $yes и $no должны просто yes и no, так как вам просто нужны строки yes и no.

Здесь вы можете использовать инструкцию case, которая (IMHO) упрощает выполните несколько случаев на основе ввода:

case $input in [Yy]es) # The first character can be Y or y, so both Yes and yes work echo "Hello!" echo "Hello!" | festival --tts ;; [Nn]o) # no or No echo "Are you sure?" echo "Are you sure?" | festival --tts ;; *) # Anything else echo "Please answer yes or no." echo "Please answer yes or no." | festival --tts ;; esac

Вы можете обернуть два оператора echo и использовать festival в функции, чтобы избежать повторения:

textAndSpeech () { echo "$@" echo "$@" | festival --tts } case $input in [Yy]es) # The first character can be Y or y, so both Yes and yes work textAndSpeech "Hello!" ;; [Nn]o) # no or No textAndSpeech "Are you sure?" ;; *) # Anything else textAndSpeech "Please answer yes or no." ;; esac

С помощью $input bash заменяет это своим значением, которое изначально ничего не происходит, поэтому запуск команды read:

read

И read по умолчанию сохраняет вход в переменной REPLY. Таким образом, вы можете, если хотите, полностью исключить переменную input и использовать $REPLY вместо $input.

Также посмотрите на инструкцию select в Bash.

13
ответ дан 17 July 2018 в 13:53

Основная проблема здесь:

read $input

В bash обычно $foo является значением переменной foo. Здесь вам не нужно значение, но имя переменной, поэтому оно должно быть просто:

read input

Аналогично, в тестах if $yes и $no должны просто yes и no, так как вам просто нужны строки yes и no.

Здесь вы можете использовать инструкцию case, которая (IMHO) упрощает выполните несколько случаев на основе ввода:

case $input in [Yy]es) # The first character can be Y or y, so both Yes and yes work echo "Hello!" echo "Hello!" | festival --tts ;; [Nn]o) # no or No echo "Are you sure?" echo "Are you sure?" | festival --tts ;; *) # Anything else echo "Please answer yes or no." echo "Please answer yes or no." | festival --tts ;; esac

Вы можете обернуть два оператора echo и использовать festival в функции, чтобы избежать повторения:

textAndSpeech () { echo "$@" echo "$@" | festival --tts } case $input in [Yy]es) # The first character can be Y or y, so both Yes and yes work textAndSpeech "Hello!" ;; [Nn]o) # no or No textAndSpeech "Are you sure?" ;; *) # Anything else textAndSpeech "Please answer yes or no." ;; esac

С помощью $input bash заменяет это своим значением, которое изначально ничего не происходит, поэтому запуск команды read:

read

И read по умолчанию сохраняет вход в переменной REPLY. Таким образом, вы можете, если хотите, полностью исключить переменную input и использовать $REPLY вместо $input.

Также посмотрите на инструкцию select в Bash.

13
ответ дан 20 July 2018 в 13:57

TL; DR: исправить ошибки синтаксиса, убедитесь, что вы действительно имеете непустые переменные в тесте [, и сделайте функцию для передачи через tee в festival.

печать на экран и вывод на festival, я лично перенес скрипт в функцию и передаю все на festival, с tee между ними (который отправляет текст как на экран, так и на канал).

[d3 ] Однако есть три проблемы синтаксиса:

read $input должен быть read input. Переменная символов $ символов в сценариях оболочки (т. Е. [F12] будет заменена тем, что выполняется input). Вы не указали никакие переменные yes и no. То, что вы должны делать, это сравнение строк: [ "$input" == "yes" ] Экстра ]] в elif

Что касается того, почему вы получаете Hello! все время, это точно из-за первых двух пулевых точек. Перед read $input переменная input не существует, поэтому вы выполняете только read (т. Е. Несуществующая переменная $input разыменовывается в пустую строку, оставляя там только команду read). Таким образом, все, что вы напечатаете, сохраняется в переменной REPLY, что используется read, если имя переменной не указано. И поскольку переменная yes не существует, она также заменяется пустой строкой. Таким образом, в действительности [ $input == $yes ] рассматривается как [ "" == "" ], что всегда верно.

$ [ $nonexistent == $anothernonexistent  ] && echo "Success"
Success

Фиксированный скрипт должен быть таким:

#!/bin/bash
main(){
    read -p "Are you there?" input  

    if [ "$input" == "yes" ]; then  
        echo "Hello!"  
    elif [ "$input" == "no" ]; then  
        echo "Are you sure?"  
    else  
        echo "Please answer yes or no."  
    fi 
}
main | tee /dev/tty | festival --tts

Не забудьте указать переменные и прочитать разницу между = и == в тестовой команде.

13
ответ дан 22 May 2018 в 10:35
  • 1
    Можно ли использовать тэп для соединения cmatrix с фестивалем? .. просто не спрашивайте, для чего. – Willtech 20 May 2018 в 15:07
  • 2
    @Willtech Ну, да, это возможно. Все символы cmatrix отображаются из переносимого набора символов, поэтому я не вижу проблемы с другими языками локали, как в «real», матричный поток. Но я не знаю, как festival будет работать с этим, это будет всего лишь много тарабарщины. Но теоретически все будет хорошо. – Sergiy Kolodyazhnyy 20 May 2018 в 19:23

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

Также shopt -s nocasematch в сочетании с [[ для сравнения строк без учета регистра. С этим также выполняются YES и NO как допустимый вход.

shopt [[

#!/bin/bash

shopt -s nocasematch

read -p "Are you there?" input  

if [[ "$input" == "yes" ]]; then  
    msg="Hello!"  
elif [[ "$input" == "no" ]]; then  
    msg="Are you sure?"  
else  
    msg="Please answer yes or no."  
fi 

echo $msg
echo $msg | festival --tts
2
ответ дан 22 May 2018 в 10:35

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

Также shopt -s nocasematch в сочетании с [[ для сравнения строк без учета регистра. С этим также выполняются YES и NO как допустимый вход.

shopt [[

#!/bin/bash shopt -s nocasematch read -p "Are you there?" input if [[ "$input" == "yes" ]]; then msg="Hello!" elif [[ "$input" == "no" ]]; then msg="Are you sure?" else msg="Please answer yes or no." fi echo $msg echo $msg | festival --tts
2
ответ дан 17 July 2018 в 13:53

TL; DR: исправить ошибки синтаксиса, убедитесь, что вы действительно имеете непустые переменные в тесте [, и сделайте функцию для передачи через tee в festival.

печать на экран и вывод на festival, я лично перенес скрипт в функцию и передаю все на festival, с tee между ними (который отправляет текст как на экран, так и на канал).

Однако есть три проблемы синтаксиса:

read $input должен быть read input. Переменная символов $ символов в сценариях оболочки (т. Е. [F12] будет заменена тем, что выполняется input). Вы не указали никакие переменные yes и no. То, что вы должны делать, это сравнение строк: [ "$input" == "yes" ] Экстра ]] в elif

Что касается того, почему вы получаете Hello! все время, это точно из-за первых двух пулевых точек. Перед read $input переменная input не существует, поэтому вы выполняете только read (т. Е. Несуществующая переменная $input разыменовывается в пустую строку, оставляя там только команду read). Таким образом, все, что вы напечатаете, сохраняется в переменной REPLY, что используется read, если имя переменной не указано. И поскольку переменная yes не существует, она также заменяется пустой строкой. Таким образом, в действительности [ $input == $yes ] рассматривается как [ "" == "" ], что всегда верно.

$ [ $nonexistent == $anothernonexistent ] && echo "Success" Success

Фиксированный скрипт должен быть таким:

#!/bin/bash main(){ read -p "Are you there?" input if [ "$input" == "yes" ]; then echo "Hello!" elif [ "$input" == "no" ]; then echo "Are you sure?" else echo "Please answer yes or no." fi } main | tee /dev/tty | festival --tts

Не забудьте указать переменные и прочитать разницу между = и == в тестовой команде.

14
ответ дан 17 July 2018 в 13:53

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

Также shopt -s nocasematch в сочетании с [[ для сравнения строк без учета регистра. С этим также выполняются YES и NO как допустимый вход.

shopt [[

#!/bin/bash shopt -s nocasematch read -p "Are you there?" input if [[ "$input" == "yes" ]]; then msg="Hello!" elif [[ "$input" == "no" ]]; then msg="Are you sure?" else msg="Please answer yes or no." fi echo $msg echo $msg | festival --tts
2
ответ дан 20 July 2018 в 13:57

TL; DR: исправить ошибки синтаксиса, убедитесь, что вы действительно имеете непустые переменные в тесте [, и сделайте функцию для передачи через tee в festival.

печать на экран и вывод на festival, я лично перенес скрипт в функцию и передаю все на festival, с tee между ними (который отправляет текст как на экран, так и на канал).

Однако есть три проблемы синтаксиса:

read $input должен быть read input. Переменная символов $ символов в сценариях оболочки (т. Е. [F12] будет заменена тем, что выполняется input). Вы не указали никакие переменные yes и no. То, что вы должны делать, это сравнение строк: [ "$input" == "yes" ] Экстра ]] в elif

Что касается того, почему вы получаете Hello! все время, это точно из-за первых двух пулевых точек. Перед read $input переменная input не существует, поэтому вы выполняете только read (т. Е. Несуществующая переменная $input разыменовывается в пустую строку, оставляя там только команду read). Таким образом, все, что вы напечатаете, сохраняется в переменной REPLY, что используется read, если имя переменной не указано. И поскольку переменная yes не существует, она также заменяется пустой строкой. Таким образом, в действительности [ $input == $yes ] рассматривается как [ "" == "" ], что всегда верно.

$ [ $nonexistent == $anothernonexistent ] && echo "Success" Success

Фиксированный скрипт должен быть таким:

#!/bin/bash main(){ read -p "Are you there?" input if [ "$input" == "yes" ]; then echo "Hello!" elif [ "$input" == "no" ]; then echo "Are you sure?" else echo "Please answer yes or no." fi } main | tee /dev/tty | festival --tts

Не забудьте указать переменные и прочитать разницу между = и == в тестовой команде.

14
ответ дан 20 July 2018 в 13:57
  • 1
    Можно ли использовать тэп для соединения cmatrix с фестивалем? .. просто не спрашивайте, для чего. – Willtech 20 May 2018 в 15:07
  • 2
    @Willtech Ну, да, это возможно. Все символы cmatrix отображаются из переносимого набора символов, поэтому я не вижу проблемы с другими языками локали, как в «real», матричный поток. Но я не знаю, как festival будет работать с этим, это будет всего лишь много тарабарщины. Но теоретически все будет хорошо. – Sergiy Kolodyazhnyy 20 May 2018 в 19:23

Другие вопросы по тегам:

Похожие вопросы: