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

#!/bin/bash
# init
function pause(){
   read -p "$*"
}

   echo & echo "(Website):" &&read input
   output=$(ping -c 1 "$input" 2>/dev/null)
   if [ $? -eq 0 ]; then
   ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}'  2>/dev/null)
   clear
   echo
   echo "$ip"; 
   echo -n $ip | xclip -selection c
   echo
   echo
   echo IP copied to clipboard.
   echo
   echo && sleep 2
   pause 'Press [Enter] key to exit...'
   exit
else
   clear
   echo
   echo "Host not found";
   echo && sleep 1
   pause 'Press [Enter] key to exit...'
   exit
fi

Но теперь внезапно это приводит к следующей ошибке:

3: /home/username/Desktop/shell.sh: Syntax error: "(" unexpected

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

Bash версия: 4.2.45(1)-релиз
свежая установка, мята 16 (все обновлено)

РЕДАКТИРОВАТЬ: Я положу это здесь, чтобы я мог показать, что происходит.
Я полностью удалил функцию паузы:

#!/bin/bash
# init

   echo & echo "(Website):" && read input
   output=$(ping -c 1 "$input" 2>/dev/null)
   if [ $? -eq 0 ]; then
   ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}'  2>/dev/null)
   clear
   echo
   echo "$ip"; 
   echo -n $ip | xclip -selection c
   echo
   echo
   echo IP copied to clipboard.
   echo
   echo && sleep 2
   exit
else
   clear
   echo
   echo "Host not found";
   echo && sleep 1
   exit
fi  

Но когда я запускаю "sh ~/Desktop/shell.sh", я получаю это:

: not found/Desktop/shell.sh: 3: /home/username/Desktop/shell.sh:  
(Website):  

(Я набираю google.com и нажимаю ввод) и он возвращает

: bad variable name/shell.sh: 4: read: 
: not found/Desktop/shell.sh: 5: /home/username/Desktop/shell.sh: 
/home/username/Desktop/shell.sh: 24: /home/username/Desktop/shell.sh: Syntax error: word unexpected

Спасибо всем за ответы, что-то не так с самой оболочкой?

2 ответа2

0

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

Когда я запускаю скрипт с \bin \bash, кажется, что \bin\bash MyScript.sh работает правильно.
Если вместо этого я запускаю его с \bin\sh MyScript.sh это выдает мне ошибки.

Зачем?
Во многих дистрибутивах \bin\sh является символической ссылкой на dash , в других - на bash , в других может быть оригинальной sh .

Если вы измените с помощью chown u+x MyScript.sh разрешение скрипта и после вы будете выполнять его с ./MyScript.sh система будет использовать первую строку, чтобы понять, с какой shell она выполняется. Вы можете прочитать больше о Шебанге, например, здесь

Если вместо этого вы запускаете сценарий с sh MyScript.sh вы заставляете сценарий выполняться с другой оболочкой (в данном случае /bin/sh).

#!/bin/bash  

function pause(){  
   read -p "$*"  
}  

printf "\n(Website):" &&read input
output=$(ping -c 1 "$input" 2>/dev/null)
if [ $? -eq 0 ]; then
  ip=$(printf '%s' "$output" | gawk -F'[()]' '/PING/{print $2}'  2>/dev/null)
  clear                                              
  printf "\n${ip}";   
  echo -n $ip | xclip -selection c            
  printf "\n\nIP copied to clipboard.\n\n\n"
  sleep 2 
  pause 'Press [Enter] key to exit...'  
  exit 0  
else
  clear 
  printf "\n\n Host not found\n\n" 
  sleep 1  
  pause 'Press [Enter] key to exit...'  
  exit 1 
fi             

Замечания:
Я изменяю многие echo с printf , потому что в этом случае он более компактен.
С printf вы должны помнить, чтобы поставить \n для новой строки, \t для вкладки и так далее ...

-1

Удалите две скобки () из определения вашей функции, чтобы она выглядела следующим образом:

function pause {
    …
}

И эта ошибка:

неверное имя переменной /hey.sh: 4: чтение: синтаксическая ошибка: слово неожиданно

Из-за этого:

&&read input

Это должно быть так:

&& read input

Только что попробовал это с bash 4.2.47-2 на fedora linux 20 64 бит.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .