bash脚本中的错误替换

nea*_*lob 4 linux bash sh

我正在尝试让脚本工作以将交换空间添加到VPS,作为此方法的解决方法. 我以为我有它工作但现在,每次我得到错误:fakeswap.sh: 5: Bad substitution每当我尝试执行它时:sudo sh fakeswap.sh.

以下是我的代码:

#!/bin/bash

SWAP="${1:-512}"

NEW="$[SWAP*1024]"; TEMP="${NEW//?/ }"; OLD="${TEMP:1}0"

umount /proc/meminfo 2> /dev/null
sed "/^Swap\(Total\|Free\):/s,$OLD,$NEW," /proc/meminfo > /etc/fake_meminfo
mount --bind /etc/fake_meminfo /proc/meminfo

free -m
Run Code Online (Sandbox Code Playgroud)

很明显,似乎失败的替代是在线: NEW="$[SWAP*1024]"; TEMP="${NEW//?/ }"; OLD="${TEMP:1}0"

我有点惭愧地说我真的不明白应该在那条线上发生什么(除了我们似乎在某种程度上声明变量都是SWAP的衍生物之外).据我了解,下面替代新常量行成一个虚拟的配置文件(没有更好的术语),但我不明白如何变量TEMPOLD被定义.

无论如何,我想知道如果任何人可以看到为什么这种替代是不工作...也许甚至帮助我了解什么可能是发生在TEMPOLD定义?

提前谢谢了!

ric*_*ici 8

sh不是bash.该sh外壳不能识别一些有效的bash替代.

该脚本的目的是它是可执行的.你会这样做的

chmod a+x fakeswap.sh
Run Code Online (Sandbox Code Playgroud)

之后你可以通过输入来运行它

./fakeswap.sh
Run Code Online (Sandbox Code Playgroud)

(假设它在当前工作目录中;如果不在,则使用完整路径.)

顺便说一句,TEMP是一个数字的空间等于的长度NEWOLD在改变的最后空间的结果TEMP0.所以OLD并且NEW具有相同的长度,这意味着sed替换不会改变文件的大小.

  • 在某些操作系统上,/ bin/sh实际上是/ bin/bash的副本/链接,因此你可以在bash脚本上使用`sh`; 在其他操作系统(像你的 - Ubuntu,任何机会?),这将无法正常工作. (2认同)