o que há de errado com meu script de menu de escolha simples?

1

Este é um script simples que deve me deixar ir ao diretório de minha escolha, mas não está funcionando como pretendido.

#!/bin/bash

showMenu() {
    echo "1) ocaml"
    echo "2) python"
    echo "3) csharp"
}

while [ 1 ]
do
    showMenu
    read CHOICE
    case $CHOICE in
        "1")
            "cd ~/projects/practice/ocaml"
            ;;
        "2")
            "cd ~/projects/practice/python"
            ;;
        "3")
            "cd ~/projects/practice/csharp"
            ;;
    esac
done

Eu tenho todas as pastas necessárias:

(2) [01:19 PM] ls projects/practice/
csharp/  ocaml/   python/  scripts/ web/     

Saída:

(2) [01:19 PM] choice 
1) ocaml
2) python
3) csharp
1
/home/nanda/bin/choice: line 15: cd ~/projects/practice/ocaml: No such file or directory
1) ocaml
2) python
3) csharp

O script não consegue encontrar o diretório aparentemente.

Eu sinto que preciso colocar o comando cd , sob cada opção, em algum tipo de substituição (com ${} ou {} ), mas não tenho certeza de como isso pode ser feito.

Além disso, eu preciso adicionar uma instrução break após cada comando cd ?

Eu devo fazer . choice para que funcione como pretendido. Melhor ainda, coloquei um apelido como esse e funcionou:

alias choice='. choice'

Referências:
link < br> link - link

    
por Animesh 07.10.2012 / 10:15

3 respostas

4

Você tem seus comandos dentro de aspas. Isso faz com que seu shell trate cd ~/projects/practice/ocaml como um nome de comando. Como você não tem esse comando, ele imprime esta mensagem de erro. Os arquivos podem conter espaço em seu nome para que você possa ter um comando que tenha espaço no nome. Se você gostaria de executá-lo, uma maneira de fazer isso seria usar aspas como você fez.

Mas você quer que seu shell execute o comando cd e dê o caminho como argumento. Apenas aspas remotas e deve estar funcionando bem.

Se você deve ou não usar a instrução break no seu script depende do que você deseja fazer depois de alterar o diretório. Se você quiser deixar o loop, então você deve usá-lo.

Observe que o comando cd no script de shell não mudará o diretório atual depois de executar este script. Ele afetará apenas o diretório atual dentro do script (a menos que você use source em vez de executá-lo) desde quando você executa o script, novo processo é criado e cd afeta apenas o diretório atual nos processos atual e filho, não no pai um.

    
por 07.10.2012 / 10:36
4

Esta situação é exatamente o que a declaração select do shell é para:

select choice in ocaml python csharp; do
    case $choice in
        ocaml|python|csharp) break ;;
    esac
done
echo cd ~/projects/practice/$choice

Ligeiramente DRYer:

choices=(ocaml python csharp)
select choice in "${choices[@]}"; do
    [[ " ${choices[*]} " == *" $choice "* ]] && break
done
echo cd ~/projects/practice/$choice
    
por 07.10.2012 / 14:29
3

Você tem aspas ao redor do comando cd. Remova esses e você deve ficar bem.

"cd ~/projects/practice/ocaml"

diz executar esse comando - a string inteira, então ele irá procurar por um comando, incluindo o espaço e o ~ e tudo mais.

Você quer que o comando seja cd com um argumento do diretório.

    
por 07.10.2012 / 10:38

Tags