якщо твердження: 'fi' несподівано


0

Я зробив оболонку із символом if, усі символи нового рядка є LF (Linux), коли я намагаюся виконати оболонку, я отримую "помилку синтаксису: 'fi' несподівано".

if [ "$(ls -A /storage/$SDCARD_DIR/Android/obb/*/)" ]; then
    echo -n -e $Y'One of games folders on your external SDCard has been already moved\n\nTo fix that:\n- We back to main menu\n- Select rs option to restore a specifiq game file in your internal storage\n- Try again to the ma option to move all your games files to your external sdcard'$N
    clear && main_menu
else
    echo -n -e $C"For info: it's necessary to forcing games apps to be closed"$N; sleep 8;

   APPSNAMES=`for dirs in "$INTFOLD"; do printf '%s\n' $dirs | sed -r -e 's/\/storage\/emulated\/0\/Android\/obb\///' | awk -f. '{print $NF}' | sed -r -e 's/\///'`
   while printf '%s\n' "$APPSNAMES" | while IFS= read -r line
    do
        if [ -z $(ps | grep "$line") ]; then
            xargs kill
            echo -n -e $Y'Game(s) app(s) has been closed\nReady for next step...'$N; sleep 4;
        else
            echo -n -e $C'No game run in background on your device\nNext step now..'$N; sleep 4;
        fi
   done

   echo -n -e $B'Move all your games to your external SCard...'$N; sleep 5;
   for D in `find /storage/emulated/0/Android/obb/ -maxdepth 1 -type d`
    do cp -af $D $EXSDCARD
   done
   for F in `find /storage/emulated/0/Android/obb/ -type f`
    do rm -f $F
   done
   for X in `find "$EXSDCARD" -type F`
    do ln -s $X $EXSDCARD
   done
   echo -n -e $G'All OBB files are now moved to your sdcard\nNB: You could even see files in your internal storage, but they are just linked\n'$N; sleep 7;
   echo -n -e $B'Back to main menu...'$N; sleep 5;
main_menu
fi

Я не розумію, чому я отримую цю помилку, я хотів би зазначити, що я використовую цей скрипт в Android-середовищі разом з Termux, Busybox та отримую root-доступ.

Я вже перевірив кілька потоків користувачів з однаковою проблемою, але я не знаходжу жодної помилки.


Дивіться дубль whileу while printf '%s\n' "$APPSNAMES" | while IFS= read -r line, лише один з яких має відповідний do/ done.
Стефан Шазелас

5
ще один плагін для shellcheck.net
Джефф Шаллер

При призначенні APPSNAMESвам використовується forпетля. Ця петля ніколи не закривається. Також дивіться unix.stackexchange.com/questions/321697
Kusalananda

У doкоді всього п’ять , але лише чотири done. При цьому їх шість forабо while.
Kusalananda

Дуже дякую StéphaneChazelas, дякую Джеффу Шаллеру за веб-сайт та Kusalananda за його виправлення, але деякі мої петлі не виконали цього.
Ром

Відповіді:


0

Єдина думка, яка мені не подобається (бачу, що це неправильно), - це

 while printf '%s\n' "$APPSNAMES" | while IFS= read -r line

Два батоги і тільки один зробив + зробив


for dirs in "$INTFOLD"Також не маєdone
Stéphane Chazelas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.