scp over bash 脚本不接受省略命令

scp over bash 脚本不接受省略命令

考虑使用此scp命令发送当前目录中除 shell 脚本之外的所有文件和目录。

scp -r ./!(*.sh) [email protected]:~/

当从终端运行此命令时,它工作正常。我正在尝试在 bash 脚本中运行相同的命令,为此我必须以这种方式更改它

scp -r ./!\(*.sh\) [email protected]:~/

但它返回这个错误

./!(*.sh): No such file or directory

编辑1 使用完整引用如下

scp -r './!(*.sh)' [email protected]:~/

返回相同的错误

编辑2 完整的脚本如下所示

#!/bin/bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
cd "${DIR}" || exit

echo -e "Sending all scripts to $1."
shopt -s extglob
scp -r -P $1 ./!\(*.sh\) [email protected]:$2
  • 将 scp 作为一个单独的函数解决了正则表达式的问题,如下所示:
#!/bin/bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ]; do
  DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
  SOURCE="$(readlink "$SOURCE")"
  [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"
done
DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
cd "${DIR}" || exit

run_scp() {
    scp -r -P $PORT $1 [email protected]:$TARGET_DIR
}

PORT=$1
TARGET_DIR=$2

echo -e "Sending all scripts to $PORT."
shopt -s extglob
run_scp ./!\(*.sh\)

答案1

将正则表达式作为参数传递给运行scp命令的函数可以解决此问题。另一方面,您需要extglob在传递参数之前设置选项。

run_scp() {
    scp -r -P $PORT $1 [email protected]:$TARGET_DIR
}

PORT=$1
TARGET_DIR=$2

shopt -s extglob
run_scp ./!\(*.sh\)

相关内容