ошибка синтаксического анализатора скрипта оболочки двойные кавычки закрываются даже при закрытии

#linux #bash #shell #sh

Вопрос:

 #!/data/data/com.termux/files/usr/bin/bash
basedir=$(dirname "$0")

#unset LD_PRELOAD in case termux-exec is installed. If termux-exec is also installed inside the jail it will set again.
unset LD_PRELOAD

command="proot"
command =" -r $basedir/termux-fs"
command =" -b /system"
command =" -b /dev/"
command =" -b /sys/"
command =" -b /etc/"
command =" -b /proc/"
command =" -b /vendor"
command =" -b /data/dalvik-cache/"
command =" -b /property_contexts"
if [ -n "$(ls -A "$basedir"/binds)" ]; then
    for f in $basedir/binds/* ;do
        . "$f"
    done
fi

command =" -w /data/data/com.termux/files/home/"
command =" /data/data/com.termux/files/usr/bin/env -i"
command =" HOME=/data/data/com.termux/files/home"
command =" PATH=/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets"
command =" TERM=$TERM"
command =" ANDROID_DATA=/data"
command =" ANDROID_ROOT=/system"
command =" EXTERNAL_STORAGE=/sdcard"
command =" LANG=$LANG"
command =" LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib"
command =" PREFIX=/data/data/com.termux/files/usr"
command =" TMPDIR=/data/data/com.termux/files/usr/tmp"
com="$@"

if [ -z "$com" ];then
    eval "exec $command login"
else
    eval "exec $command login -c "$com""
fi
 

Ошибка

 
./start.sh: line 39: unexpected EOF while looking for matching `"'
./start.sh: line 41: syntax error: unexpected end of file
 

Все двойные кавычки закрыты, почему он продолжает выдавать ошибку
Попытался запустить через sh вместо bash, но все равно ошибки

также он показывает ошибки по команде =» -b /system» о закрытии двойных кавычек может кто-нибудь объяснить?

Комментарии:

1. Проверьте свой сценарий с помощью shellcheck.

Ответ №1:

Перепроверьте строку:

 eval "exec $command login -c "$com""
 

Вы должны избегать двойных кавычек в оболочке.

https://unix.stackexchange.com/questions/30903/how-to-escape-quotes-in-shell

Ответ №2:

Тебе это не нужно eval . Используйте массивы для хранения аргументов команды.

 #!/data/data/com.termux/files/usr/bin/bash
basedir=$(dirname "$0")

#unset LD_PRELOAD in case termux-exec is installed. If termux-exec is also installed inside the jail it will set again.
unset LD_PRELOAD

command="proot"
command_args=( 
  -r "$basedir/termux-fs"
  -b /system
  # etc
)

command_args =(-b /property_contexts)

shopt -s nullglob
for f in "$basedir"/binds/*; do . "$f"; done

command_args =(
  -w /data/data/com.termux/files/home/
  /data/data/com.termux/files/usr/bin/env -i
  HOME=/data/data/com.termux/files/home  
  PATH=/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets
  "TERM=$TERM"
  # etc
  login
)
    
if (( $# == 0 )); then
  command_args =( -c "$@" )
fi

exec "$command" "${command_args[@]}"