Вы можете найти более эффективным для прямого поиска файлов, не принадлежащих пользователю ...
find /directory ! -user username -printf "%u %p\n"
Основная проблема здесь:
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.
Основная проблема здесь:
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.
Основная проблема здесь:
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.
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
Не забудьте указать переменные и прочитать разницу между = и == в тестовой команде.
Третий подход состоял бы в том, чтобы назначить общую переменную для каждого случая и в конце действовать на эту переменную. Я не уверен, насколько распространен этот подход в 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
Третий подход состоял бы в том, чтобы назначить общую переменную для каждого случая и в конце действовать на эту переменную. Я не уверен, насколько распространен этот подход в 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
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
Не забудьте указать переменные и прочитать разницу между = и == в тестовой команде.
Третий подход состоял бы в том, чтобы назначить общую переменную для каждого случая и в конце действовать на эту переменную. Я не уверен, насколько распространен этот подход в 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
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
Не забудьте указать переменные и прочитать разницу между = и == в тестовой команде.