无法运行脚本包含*使用ssh

时间:2017-08-19 21:35:27

标签: linux bash shell

我正在尝试运行一个带有通配符的脚本来搜索文件,但是因为收到错误而失败:

bash: *: syntax error: operand expected (error token is "*")

这个脚本在一台机器上运行正常,但是当尝试在ssh命令中使用时,它就会掉线。这是一个命令:

 ssh -o StrictHostKeyChecking=no user@local-dev-server 'for i in *.version; do j=$(echo $i | cut -f 1 -d '.'); mv $i  $((j+1)).version; done;'

有人可以告诉我如何解决这个问题。

3 个答案:

答案 0 :(得分:1)

问题是,如果当前目录中没有.version个文件,则代码会尝试将{1}添加到*.version,这是算术错误。

在没有文件的目录中,观察:

$ ls
$ for i in *.version; do j=$(echo $i | cut -f 1 -d '.'); mv $i  $((j+1)).version; done
bash: *: syntax error: operand expected (error token is "*")

如果有一个number.version文件,则代码将运行:

$ touch 1.version
$ ls
1.version
$ for i in *.version; do j=$(echo $i | cut -f 1 -d '.'); mv $i  $((j+1)).version; done
$ ls
2.version

此外,cut管道是不必要的。代码可以简化为:

for i in *.version; do mv "$i" "$((${i%.version}+1)).version"; done

此外,为避免丢失文件错误,请使用nullglob

shopt -s nullglob; for i in *.version; do mv "$i" "$((${i%.version}+1)).version"; done

答案 1 :(得分:-1)

尝试将选项包装在引号中:

ssh -o "StrictHostKeyChecking=no" user@local-dev-server 'for i in *.version; do j=$(echo $i | cut -f 1 -d '.'); mv $i  $((j+1)).version; done;'

答案 2 :(得分:-1)

试试这个

 ssh -o StrictHostKeyChecking=no user@local-dev-server `for i in `*.version`; do j=$(echo $i | cut -f 1 -d '.'); mv $i  $((j+1)).version; done;'