LINUX.ORG.RU

Ошибка при выполнении скрипта - eval: Syntax error: Unterminated quoted string

 , ,


0

2

В первый раз вроде абы как работало. Добавил пару новых строк. Теперь не реагирует. При запуске выдаёт ошибку: votelist.sh: 1: eval: Syntax error: Unterminated quoted string В чём проблема, понять не могу. Подскажите, умные люди.

Вот код:

#!/bin/bash
cd /home/fghost/www/uservoteslist/ #Переход в папку с файлами
name=`find . -type f | wc -l` #Общее кол-во файлов в папке
number=$name
xjo=`shuf -i 1-5 -n 1` #Рандомное число от 1 до 5

while [ $number -gt 0 ] #Выполнять цикл пока number больше 0
do
	data=`cat /home/fghost/www/uservoteslist/$number.txt` #Получаем переменные из файла
	for i in $data; do eval $i; done #Получаем переменные из файла
	
	if [ "$completed" = "" ]; then #Если переменной не существует то выполняем
		if [ $statusgift -eq 1 ]; then #Если значение statusgift = 1 тогда
			#-------------------------------------
			#Подбираем функцию под рандомное значение
			if [ $xjo -eq 1 ]; then 
				screen -x sandbox -X stuff 'ulx tempadduser $username gift 1440 user^M'
				else
			return
			fi
			if [ $xjo -eq 2 ]; then 
				screen -x sandbox -X stuff 'ulx tempadduser $username gift2 1440 user^M'
				else
			return
			fi
			if [ $xjo -eq 3 ]; then 
				screen -x sandbox -X stuff 'ulx tempadduser $username gift3 1440 user^M'
				else
			return
			fi
			if [ $xjo -eq 4 ]; then 
				screen -x sandbox -X stuff 'ulx tempadduser $username gift4 1440 user^M'
				else
			return
			fi
			if [ $xjo -eq 5 ]; then 
				screen -x sandbox -X stuff 'ulx tempadduser $username gift5 1440 user^M'
				else
			return
			fi
		
		echo "completed='yes'" >>/home/fghost/www/uservoteslist/$number.txt #Ставим статус 'завершено'
		number=$(($number-1)) #Вычитаем от самого большого значения 1 и переходим к проверке нового файла
		fi
	else return
	fi
done

Суть скрипта в том, что-бы выдавать призовые группы на сервере. Тут происходит подсчёт всех файлов в папке и сравнение их переменных. Пример содержимого ещё не завершённого файла:

username="Filo"
statusgift="1"
Когда скрипт окончит проверку и выполнение, файл будет выглядеть так:
username="Filo"
statusgift="1"
completed="yes"

Вроде всё что только можно рассказал, в принципе основная проблем в этом - votelist.sh: 1: eval: Syntax error: Unterminated quoted string

Ты в eval передаёшь выхлоп, в котором есть что-то типа Johnson's?

r3lgar ★★★★★
()

if [ $xjo -eq 1 ]; then

Это 3.14-здец, товарищи!

case $xjo in
  [1-5])
    screen -x sandbox -X stuff "ulx tempadduser $username gift${xjo} 1440 user^M"
    ;;
  *) return ;;
esac

И замени все return на break в теле цикла.

r3lgar ★★★★★
()
Последнее исправление: r3lgar (всего исправлений: 3)

data=`cat /home/fghost/www/uservoteslist/$number.txt` #Получаем переменные из файла
for i in $data; do eval $i; done

. «/home/fghost/www/uservoteslist/$number.txt» , не-а?

anonymous
()
Ответ на: комментарий от r3lgar

Это 3.14-здец, товарищи!

Угу, о DRY не слыхивали, copy/paste во все поля.

anonymous
()

data=`cat /home/fghost/www/uservoteslist/$number.txt` #Получаем переменные из файла
for i in $data; do eval $i; done #Получаем переменные из файла

source /home/fghost/www/uservoteslist/$number.txt
ashot ★★★★
()

гы

...
if [ "$completed" = "" ]; then #Если переменной не существует то выполняем
...

замени на

...
if [ "x$completed" = "x" ]; then #Если переменной не существует то выполняем
...

подстановка пустой строки в квадратных скобках ломает синтаксис

anonymous
()

И ещё, надо больше строк с путём: /home/fghost/www/uservoteslist/
Это я к тому, в переменную запихнуть нельзя?

anonymous
()
Ответ на: комментарий от anonymous

подстановка пустой строки в квадратных скобках ломает синтаксис

да ну?, это в совсем древних sh, или пруф

а вот на [ -z «$completed» ] (или bashism: [[ -z $completed ]]) заменить можно

anonymous
()
Ответ на: комментарий от das_tier

[[ - это не башизм

ну-ка, дай свое определение ; надеюсь, ты не будешь вертеть полушариами и говорить, что, мол, в ksh / zsh сие появилось раньше (если даже действительно так)

anonymous
()
Ответ на: комментарий от anonymous

раз это работает не только в Bash, значит это не башизм. Если только ты не называешь башизмом всё, что что не работает в sh.

das_tier ★★★★★
()
Ответ на: комментарий от das_tier

раз это работает не только в Bash, значит это не башизм

ну началось, согласно твоей логике, после первого форка баша все башизмы, внезапно пропадут.. или если заимствовали (портировали) в каком-то ином шелле

Если только ты не называешь башизмом всё

еще раз: дай свое определение, посмотрим ; а по умолчания я склонен доверять даже этой страничке: https://wiki.ubuntu.com/DashAsBinSh больше, нежели рандомному представителю лора

anonymous
()
Ответ на: комментарий от anonymous

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

По ссылке какая-то чушь.

das_tier ★★★★★
()
Ответ на: комментарий от anonymous

Видимо, ты хочешь сказать, что башизм - это то, что не определено в POSIX. С этим тоже нельзя не согласиться, да.

das_tier ★★★★★
()
Ответ на: комментарий от das_tier

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

а другие, это какие? другая версия баш, или ветка или гипотетический форк vasya-pupkin-shell к ним относятся?

По ссылке какая-то чушь.

у я тебе должен дать больше кредита доверия, чем хотя бы ubuntu-wiki, потому что..?

не POSIX

меня бы устраило, по крайней-мере это определение - конкретно и полезно (дает информацию о дополнительном наборе: у "... _только_ в bash" - будет слишком маленький набор, да и расплывчатый)

anonymous
()
Ответ на: комментарий от anonymous

Обычно не считаю башизмом то, что работает и в ksh.

Например, вот здесь говорят, что [[ is not defined by POSIX, originated in ksh and is also present in zsh. А раз завезли в несколько шеллов, включая Bash (в последнюю очередь), значит не башизм. Вот что я, собственно, хотел сказать.

А ksh чаще всего уже есть даже на UNIX хостах, так что [[ - это норм и переносимо.

das_tier ★★★★★
()
Ответ на: комментарий от das_tier

Обычно не считаю башизмом то, что работает и в ksh.

конкретнее, но все равно неявный контекст, мне вместо «bashism» прикажешь писать «не-POSIX, но есть в ksh» (опционально добавляя /zsh/mksh)?

вот здесь

страничка-то называется: http://mywiki.wooledge.org/Bashism

А ksh чаще всего уже есть даже на UNIX хостах

а, например, на адроиде, емнип, mksh, а там нет <(..), который есть в bash/ksh, и, если [[ - туда переносимо, то не <(..) - который не bashism в твоем определении (и вряд ли переносим даже на систем с ksh: /dev/fd не во всех юниксах)

[[ - это норм и переносимо.

в основном, да

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.