2015-07-02 3 views
-1

Я изучаю BASH-скрипты, и у меня есть проблема. Я написал генератор, который проверяет, есть ли сценарий с тем же именем, что и заданный, и если он не делает его, делает его исполняемым и дает ему правильную shebang. Но это не сработает. Я хотел, чтобы он вышел, когда уже есть один скрипт с этим именем. Можете ли вы сказать мне, что я делаю неправильно?Как остановить скрипт, когда «if» is false

#!/bin/bash 

clear 

echo "Name the script" 
read name 
echo "What shell? (bash/sh)" 
read type 
if [ -e ./$name ] 

then 
    echo "You already have that script" 
    read  
    exit 
else 
    touch $name 
    chmod 755 $name 
fi 

case $type in 
"bash") echo '#!/bin/bash' > $name ;; 
"sh") echo '#!/bin/bash' > $name ;; 
*) echo "I don't know what do you want" ;; 
esac 
vim $name 
+2

У вас есть 'vim' в конце. Это предназначено? – fedorqui

+2

Похоже, он должен работать. Каким образом это не работает? –

+0

В качестве побочного примечания вы должны проверить '-x' и' -e' (или еще лучше '-f'). Потому что, если '-e' проверяется, сценарий все еще не может иметь разрешения на выполнение (отметьте с помощью' -x'). Выход должен работать здесь, но указание кода выхода - лучшая практика (например, 'exit 1'), хотя это и не нужно. – ShellFish

ответ

0

Существует дополнительный read, который держит вас:.

if [[ -e ./$name ]] 
then 
    echo "'./$name' already exists" # <<<< always report the name 
    # read  <<<< This is the line which is causing problems 
    exit 1 # <<<< indicate there was an error 
else 
    touch "$name" 
    chmod 755 "$name" 
fi 

Quote имен файлов упаковывают они содержат встроенные пробелы (вам не нужно их вокруг переменных, если вы используете [[ ]]

Также обратите внимание, что строка #! для sh неверна (вы используете bash для обоих)

Редактировать: Если в вашей системе /etc/shells, это отличное упражнение в использовании меню select. Попробуйте это:

#!/bin/bash 

read -p "Name the script: " name 

if [[ -e ./$name ]] 
then 
    echo "'./$name' already exists" # <<<< always report the name 
    # read  <<<< This is the line which is causing problems 
    exit 1 # <<<< indicate there was an error 
else 
    touch "$name" 
    chmod 755 "$name" 
fi 

declare -a shells 
i=0 
while read shell 
do 
    if [[ $shell != \#* && $shell != "" ]] 
    then 
     shells[i++]="$shell" 
    fi 
done < /etc/shells 

PS3='Please select the shell: ' 
select type in "${shells[@]}" QUIT 
do 
    echo "You selected $type" 
    if [[ $type == QUIT ]] 
    then 
     exit 2 
    fi 
    break 
done 

echo "#!$type" > "$name" 

vim $name 

Вы могли бы также рассмотреть возможность использования $EDITOR, а не жесткое кодирование vim.

+0

Спасибо, теперь это работает. – Aykan