目前我有两个脚本,一个用于文件,一个用于网址,我想将它们组合起来。
下面的脚本是组合的。当传递一个参数时,如果它是一个 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 块的一部分,则嵌套方法(最初使用的)也将起作用else
:if 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