Отличается ли синтаксис if-then-else на Ubuntu от CentOS? [дубликат]

Я пытаюсь запустить этот простой сценарий, который успешно выполняется на CentOS, но не на Ubuntu. Сценарий запускается успешно, но не может попасть в условие if и сразу переместиться в другое.

Имеется ли синтаксическая ошибка с циклом if? Идея состоит в том, чтобы получить содержимое имени файла output2.txt в переменную с именем value (эта команда OK?) и проверить, включен ли подтекст 512 .00GB в текст (в value )...

sudo msecli -L > output2.txt
value=`cat output2.txt`
check="512.00GB"
#echo "$value"
if [[ "$value" == *"$check"* ]]; then
  echo "The SSD is 512GB"
sudo msecli -L >> output.txt
sudo nvme delete-ns -n 1 /dev/nvme0
sudo nvme delete-ns -n 1 /dev/nvme1
sleep 1
sudo msecli -N -q 100 -n /dev/nvme0 -r
sleep 1
sudo msecli -N -q 100 -n /dev/nvme1 -r
sleep 2
sudo reboot
else
sudo msecli -L >> output.txt
echo "***** The SSD is READY!!! *****"
fi

Полученная ошибка находится в строке 5 [[, которая кажется командой if не работает.

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

#example
#STR='GNU/Linux is an operating system'
#SUB='Linux'
#if [[ "$STR" == *"$SUB"* ]]; then
#  echo "It's there."
#fi
-121--897490- Как создать анимацию поворота, затем заменить ее некоторым текстом, а затем повторить с помощью Bash Извините, если заголовок не слишком описателен. Я хочу получить следующую «анимацию»: - Название песни \ Имя песни # все эти 4 останутся на одной строке | Имя песни # замена каждого...

Извините, если заголовок не слишком описателен. Я хочу добиться следующей «анимации»:

- Song Name
\ Song Name    # all these 4 would stay on the same line by
| Song Name    # replacing each other every 0.5 seconds     
/ Song Name
current_window_title # then for 2 seconds the current window 
                     # title will be displayed

# repeat the animation from the start over and over

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

До сих пор мне удавалось получить часть анимации песни, но когда речь заходит об объединении ее с 2 секундами отображения текущего названия окна на одной строке, то это как бы головная боль.

#!/bin/bash

chars="/-\|"
while sleep 0.5; do
    echo -en "${chars:$(( i=(i+1) % ${#chars} )):1}" "Song Name" "\r"
done

Можете ли вы дать мне несколько указателей или помочь, пожалуйста? Пытался сделать это сам в течение 2 дней, но я не могу понять. Возможно ли это хотя бы?

Спасибо заранее.

4
задан 20 April 2021 в 21:15

2 ответа

Вы очень близки.

#!/bin/bash

chars="/-\|"

while sleep 0.5; do
    tput el
    echo -en "${chars:$(( i=(i+1) % ${#chars} )):1}" "Song Name" "\r"
    (($i == 3)) && sleep 0.5 && tput el && echo -en "$(xdotool getactivewindow getwindowname)" "\r" && sleep 1.5     
done
  • tput el очищает строку для следующего вывода. Хотя для Полибара она может не понадобиться ... Но она есть на всякий случай.
  • (($ i == 3)) при выполнении этого условия встретились, команды после него в той же строке, разделенные && , будут выполняться одна за другой. 3 - сколько символов в chars = "/ - \ |" , начиная с 0, поэтому 0,1,2,3 ... Имейте это в виду при изменении строки в символах .

Обратите внимание, что xdotool getactivewindow getwindowname будет получать имя текущего активного окна ... Это означает, что активное окно каждый раз запускается "$ (xdotool getactivewindow getwindowname)" .. .Это может быть вкладка вашего браузера, например, если вы нажмете на нее в это время. К сожалению, это поведение аналогично другим инструментам, таким как xprop и wmctrl ... обходным путем было бы объявить переменную перед циклом while, например, так window = "$ ( xdotool getactivewindow getwindowname) " и echo эта переменная внутри цикла, чтобы она оставалась прежней, избегая других активных окон позже ... Или вы можете установить статическое имя и echo это если вы знаете имя заранее.

2
ответ дан 23 April 2021 в 23:20

Попробуйте,

#!/bin/bash

chars="/-\|"
while :; do
    for (( i=0; i<${#chars}; i++ )); do
        printf '%s %s\r' "${chars:$i:1}" "Song Name"
        sleep 0.5
    done
    # Clear line and print window name
    printf '\033[2K%s\r' "$(xdotool getactivewindow getwindowname)"
    sleep 2
    # Go up one line and clear line
    printf "\033[2K"

done
# Add newline in the very end if you like
echo

Это комбинация:

Вам может понадобиться установить xdotool:

sudo apt install xdotool
4
ответ дан 23 April 2021 в 23:20

Другие вопросы по тегам:

Похожие вопросы: