Хорошо, теперь, когда вы отредактировали свой вопрос, я думаю, что знаю, что происходит на самом деле.
Предположим, у меня есть каталог (~/dir
), содержащий несколько файлов, и текстовый файл (~/file.txt
), содержащий несколько имен файлов:
$ ls ~/dir
1.txt 2.txt 3.txt 4.txt 5.txt
$ cat ~/file.txt
1.txt
2.txt
3.txt
4.txt
5.txt
Насколько я знаю, ваш скрипт читает содержимое ~/file.txt
и проверяет, существуют ли эти файлы (1.txt
, 2.txt
и т. д. )внутри ~/dir
.
Но при запуске скрипта:
$ script.sh ~/dir ~/file.txt
/home/user/bin/script.sh: line 11: [: -eq: unary operator expected
All files present
Итак, что происходит? Посмотрите на этот фрагмент кода:
if [ ! -f "${1}/${file}" ]; # $1 is a path
then
echo "$file is missing"
notok=$?
fi
Основным недостатком здесь является то, что если содержимое как ~/dir
, так и ~/file.txt
совпадает, echo "$file is missing"; notok=$?
никогда не выполняется. Затем, если переменная notok
не имеет значения, [ ${notok} -eq 0 ]
терпит неудачу, потому что ${notok}
расширяется до нуля (, как многие из нас подозревали ).
Этот недостаток не единственный, но именно он является причиной появления ошибки [: -eq: unary operator expected
.
Если вы не хотите переписывать свой скрипт, просто инициализируйте notok
переменную любым числом, отличным от0
перед вашим основным кодом. Например:
notok='1'
for file in `cat ${2}` #$2 is file.txt
do
if [ ! -f "${1}/${file}" ]; # $1 is a path
then
echo "$file is missing"
notok=$?
fi
done
if [ ${notok} -eq 0 ];
then
echo "need to check"
exit 1
else
echo "All files present"
fi
Работает:
# When the content of ~/dir and ~/file.txt matches
$ ls ~/dir
1.txt 2.txt 3.txt 4.txt 5.txt
$ cat ~/file.txt
1.txt
2.txt
3.txt
4.txt
5.txt
$ script.sh ~/dir ~/file.txt
All files present
# When the content of ~/dir and ~/file.txt does not match
$ ls ~/dir
1.txt 2.txt 3.txt 4.txt 5.txt
$ cat ~/file.txt
foo
1.txt
2.txt
3.txt
4.txt
5.txt
$ script.sh ~/dir ~/file.txt
foo is missing
need to check
Но если бы мне пришлось переписывать сценарий, я бы сделал что-то вроде этого:
# Initialize variables
# It's possible to parse arguments like `-d DIR -f FILE` but let's keep simple
dir="${1}"
txt="${2}"
missing='0'
# Don't read lines with for!
while IFS='' read -r 'file'; do
if [ ! -f "${dir}/${file}" ]; then
echo "Missing file: ${file}"
# Use a simple counter instead of catch the exit code of `echo`
missing=$(( missing + 1 ))
fi
done < "${txt}"
if [ "${missing}" -gt '0' ]; then
echo "Total: ${missing}"
exit '1'
else
echo 'All files are present'
fi
Это работает, когда я увеличиваю частоту дискретизации. Сейчас я установил его на 88200, и он работает очень хорошо без XRUN и заиканий.
Вы можете сделать это в QJackCtl вSetup...
->Settings
->Parameters