Вложенный скрипт bash if then else не работает должным образом для разделения URL и файлов

Я удалил его супервизора и установил снова. Тогда это сработало для меня.

sudo apt-get purge supervisor
sudo apt-get install supervisor
cp path/to/file.conf /etc/supervisor/conf.d/
sudo supervisorctl reread
sudo supervisorctl update
0
28.07.2020, 09:49
3 ответа

Логика может быть изменена для использованияelif:

if A; then
  : do something for condition A
elif B; then
  : do something for condition B
else
  : do something else
fi

Замените секции A/ B/ :на свои команды.

Вложенный подход (, использовавшийся первоначально ), также будет работать, если второй цикл forбудет перемещен вверх, чтобы стать частью вложенного блока if else:if A; then :; else if B; then :; else :; fi; fi.

Помимо этого :расширение параметра @Qbash обычно не то, что вы хотите передать в качестве аргумента команде. foo_esc="${x@Q}"; mediainfo "$foo_esc"не будет работать правильно, но mediainfo "$x"будет. Чтобы использовать подстановочные знаки при передаче аргументов сценарию, не заключайте подстановочный знак:script "John's file*.mp4"-> script "John's file"*.mp4в кавычки.

Всегда есть несколько способов сделать это. С помощью bash вы можете скопировать аргументы в массив, а затем запустить mediainfoв массиве (без проверки, не знаю wget, поэтому изменено наcurl):

#!/bin/bash
echo >&2 "$# argument${2+s}"      # This will look odd when $# is 0
while [[ ${1+1} ]]; do            # Funny way of writing [[ $# -gt 0 ]]
  case $1 in
    (http:// | https://) echo >&2 "${1@Q} looks like a URL"
      file=$(curl -fOJL -w '%{filename_effective}' "$1") &&
      array+=("$file");;
    (*) echo >&2 "${1@Q} is not a URL, checking if available locally"
      { [[ -f "$1" ]] || [[ -d "$1" ]]; } &&
      array+=("$1");;
  esac
  shift
done
[[ ${#array[@]} -gt 0 ]] &&       # The while loop placed arguments into array
mediainfo "${array[@]}"           # now run command if array is not empty
1
18.03.2021, 23:16

Это работает правильно при использовании операторов elif.

#!/bin/bash
if [ "$#" -eq 0 ]
          then
        echo "no argument supplied"
elif [[ $1 != *http?(s)://* ]]; then
        echo "Invalid URL, must be a file"
        echo "$# arguments:"
    for x in "$@"; do
            foo_esc="${x@Q}"
            echo "file is "$foo_esc""
            mediainfo "$foo_esc"
    done
else
        echo "$# arguments:"
for y in "$@"; do
        file=$(wget --content-disposition -nv "$y" 2>&1 |cut -d\" -f2)
        echo "output is "$file""
        mediainfo "$file"
    done
fi
0
18.03.2021, 23:16

Вы можете сохранить это в info.sh

#!/bin/bash

url_info() {
    url=$1
    file=$(wget --content-disposition -nv "$url" 2>&1 | cut -d\" -f2)
    echo output is "$file"
    mediainfo "$file"
}

file_info() {
    file=$1
    file_esc="${file@Q}"
    echo file is "$file_esc"
    mediainfo "$file_esc"
}

# Error if no arguments supplied
if [[ $# -eq 0 ]];
then
    echo "no argument supplied"
    exit 0
fi

# Loop over arguments and call appropriate function
for arg in "$@";
do
    if [[ $arg == http* ]];
    then
        url_info "$arg"
    else
        file_info "$arg"
    fi
done

, затем

chmod +x info.sh
./info.sh "http://example.com" "Some file.mp4"
1
18.03.2021, 23:16

Теги

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