0

我正在编写一个 bash 包装器,用于 scp'ing 进出具有特定用户名的特定主机,例如:

johny@bonjour:~/bin$ cat scpphcl 
#!/bin/bash

download=false
upload=false
local=""
remote=""

usage()
{
    echo "Usage: $0 -d[-u] -l <LocalPath> -r <RemotePath>"
    exit 1
}

while getopts "h?dul:r:" opt; do
    case "$opt" in
    h|\?)
        usage
        ;;
    d)
        download=true
        upload=false
        ;;
    u)
        download=false
        upload=true
        ;;
    l)
        local=$OPTARG
        ;;
    r)
        remote=$OPTARG
        ;;
    esac
done

if [[ -z $local || -z $remote ]]; then
    echo "Need to provide local and remote path."
    usage
fi

if $download; then
    scp somebody@somehost:"$remote" $local
elif $upload; then
    scp $local somebody@somehost:"$remote"
else
    echo "Neither download nor upload?"
    exit 1
fi

if [[ $? -ne 0 ]]; then
    echo "Something wrong happened in the scp process."
    exit 1
fi

exit 0

它适用于通常的文件名,但如果本地文件名字段中有任何通配符,它​​将无法正常工作。

johny@bonjour:~/test$ scpphcl -u -l * -r /u/somebody/temp
Need to provide local and remote path.
Usage: /Users/johny/bin/scpphcl -d[-u] -l <LocalPath> -r <RemotePath>

有一个解决方法,如果其中有通配符,则在本地文件参数周围使用 sinqle 引号:

johny@bonjour:~/test$ scpphcl -u -l '*' -r /u/somebody/temp

但是,如果在文件夹之外发出命令,即使这个解决方法也不起作用test

johny@bonjour:~/test$ cd ..
johny@bonjour:~$ scpphcl -u -l 'test/*' -r /u/somebody/temp

这不起作用,将挂在 scp 进程中。

有关如何使用 bash 包装器在本地文件名中传递通配符的任何帮助?

4

1 回答 1

2

最好不要要求您的用户引用通配符模式。在选项参数之后,我会更改程序的接口以接受任意数量的本地路径:

echo "Usage: $0 [-d|-u] [-r <RemotePath>] <LocalPath>..."

阅读选项时,使用它们shift

while getopts "h?dur:" opt; do
    case "$opt" in
    h|\?)
        usage
        exit 0
        ;;
    d)
        download=true
        upload=false
        ;;
    u)
        download=false
        upload=true
        ;;
    r)
        remote="$OPTARG"
        ;;
    *)
        usage >&2
        exit 1
        ;;
    esac
done
shift $((OPTIND-1))

现在剩下的位置参数是本地文件名(并且可以通过"$@"- 注意那里最重要的双引号来访问):

if test -z "$*"  # no LocalPath arguments!
then usage >&2; exit 1
elif $download
then exec scp somebody@somehost:"$remote" "$@"
elif $upload
then exec scp "$@" somebody@somehost:"$remote"
fi
于 2018-02-27T16:38:44.650 回答