嵌套 bash if then else 脚本无法按预期分离 URL 和文件

嵌套 bash if then else 脚本无法按预期分离 URL 和文件

目前我有两个脚本,一个用于文件,一个用于网址,我想将它们组合起来。

下面的脚本是组合的。当传递一个参数时,如果它是一个 url,我希望它执行一个函数,如果它是一个作为参数传递的文件,我希望它执行另一个函数。有时我会使用通配符传递多个文件。

我使用 @Q 来转义特殊字符。在我的特殊情况下,引用失败。

当我运行它时,这两个功能都被执行,但我无法找出正确的安排。

示例1:script.sh "https://demo.io/download.php?id=123456"

示例1:script.sh "http://test.io/download.php?id=54321"

例3:script.sh "John's file.mp4"

示例4:script.sh "John's file*.mp4"

#!/bin/bash
if [ "$#" -eq 0 ]
          then
echo "no argument supplied"
else
if [[ $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
fi
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

答案1

可以调整逻辑以使用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 块的一部分,则嵌套方法(最初使用的)也将起作用elseif A; then :; else if B; then :; else :; fi; fi

除此之外:bash 的@Q参数扩展通常不是您想要作为参数传递给命令的内容。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

答案2

您可以将其保存在 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"

答案3

使用语句可以正常工作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

相关内容