标题:[实践OK]bad substitution的原因是用了sh不是bash导致的,Dockerfile批量替换里面的内容,cp filename{,bak} , find /var/www/ -name file -exec cp {}{,.bak} ; 递归备份文件,大括号扩展:cp和mv搭配{,}在shell作用,cp  快速备份 bash{} 扩展。 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Sun, 02 Jul 2017 19:32:47 +0000 作者:jackxiang 地址:http://jackxiang.com/post/9321/ 内容: 去掉没有用的扩展名: mv /home/pi/.config/autostart/my.desktop.bak /home/pi/.config/autostart/my.desktop的shell花括号扩展简写: root@raspberrypi:~# mv /home/pi/.config/autostart/my.desktop{.bak, } root@raspberrypi:~# ls /home/pi/.config/autostart/my.desktop /home/pi/.config/autostart/my.desktop 拷贝新非后追加的文件名: cp -rf traefik-deploy{,-hostnetwork}.yaml #ls traefik-deploy* traefik-deploy-hostnetwork.yaml traefik-deploy.yaml 用Sed进行Dockerfile批量替换里面的内容: for i in $(ls -1 */Dockerfile);do echo $i;sed -in 's#/irdc/#/irdc_irdcops/#' $i|grep -i from;echo ; done -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied) -n, --quiet, --silent 这样感觉没有直接用shell 替换来得方便好写,如下: 和Sed不一样,没有最后一个斜杠: ${string/needreplace/placedstr} $ a=abcdefg123 $ a=${a/123/456} $ echo $a abcdefg456 注意:不能是花括号里面有$,会报错: a=${$a/123/456} -bash: ${$a/123/456}: bad substitution bad substitution的原因是用了sh不是bash导致的: 在文件头里加上: #!/bin/bash 替掉:#!/bin/sh sh -x test.sh第3行总出现bad substitution提示信息,这与linux shell使用的是/bin/sh,还是/bin/bash有关系。我的脚本中指定使用的是/bin/bash shell,但是我在调试的时候使用的是sh shell,因此调试时导致错误提示信息。 原文链接:https://blog.csdn.net/u013516897/article/details/77965333 实战: str="deploy/jackxiang.com-release1/tags/55f5d6c3" echo ${str/\/tags\//:} deploy/jackxiang.com-release1:55f5d6c3 对docker tag 进行实践: for i in $(cat deploy.txt ) ;do echo docker tag $i ${i/deploy/deploy_irdcops};done 防止其它部分有deploy,缩小范围的替换: for i in $(cat deploy.txt ) ;do echo docker tag $i ${i/\/deploy\//\/deploy_irdcops\/};done 来自:https://jackxiang.com/post/9922/ 先是打印出内容,然后再静默替换,然后再不区分大小写输入替换后的那行:echo filename|grep -i from; xargs 的使用: echo nginx-1.14.2/Dockerfile|xargs grep -i from FROM registry.qr.xxxx.net/irdc_irdcops/alpine:3.10.0 要查找一个指定后缀文件里有没有一些指定字符串,显示出文件和行号等,还是用 xargs方便,如下: #find . -name Dockerfile | xargs grep -n "localtime" ./python-2.7.14/Dockerfile:18:COPY ./install/localtime /etc/ ./php-7.1.6/Dockerfile:96:COPY ./install/localtime /etc/ ./alpine-3.10.0/Dockerfile:7:COPY install/localtime /etc/ ./java-1.7.0/Dockerfile:19:COPY ./install/localtime /etc/ ./go-1.11.1/Dockerfile:4:COPY ./install/localtime /etc/ 上面一句顶exec两句,如下: #find . -name Dockerfile -exec grep -r localtime {} \; COPY ./install/localtime /etc/ COPY ./install/localtime /etc/ COPY install/localtime /etc/ COPY ./install/localtime /etc/ COPY ./install/localtime /etc/ #find . -name Dockerfile -exec grep -l localtime {} \; ./python-2.7.14/Dockerfile ./php-7.1.6/Dockerfile ./alpine-3.10.0/Dockerfile ./java-1.7.0/Dockerfile ./go-1.11.1/Dockerfile 零.批量替换文件: find . -type f -exec sed -n 's#S:"Username"=#S:"Username"=xiangdong#p' {} \; 一. find /var/www/ -name file -exec cp {}{,.bak} \; 递归备份文件 1). cp filename{,.bak} quickly backup or copy a file with bash 2). 目录会自动omit删除掉; 目录不会复制; 来自:https://www.douban.com/note/422847745/ 二. cp filename{,.bak} 这个命令是用来把filename备份成filename.bak的 等同于命令 cp filename filename.bak 这里利用的是bash的brace expansion(大括号扩展)功能 按照bash手册(man bash)所述 bash支持{a,b,c}这样的扩展 比如a{d,c,b}e会被扩展成ade ace abe 所以 filename{,.bak}被扩展成filename filename.bak也就好理解了 同理可得: tar cvfz leo{-20170202.tgz,}=tar cvfz leo-20170202.tgz leo 来自:http://leomars.blog.51cto.com/683246/1894566 三. cp filename{,.bak} //注意花括号边并没有空格,否则就不 是扩展了,变成拷贝为{,.bak}文件了。 这个命令是用来把filename备份成filename.bak,等同于命令 cp filename filename.bak 这里利用的是bash的brace expansion(大括号扩展)功能, 按照bash手册(man bash)所述: bash支持{a,b,c}这样的扩展,比如a{d,c,b}e 会被扩展成ade ace abe 所以 filename{,.bak}被扩展成filename filename.bak也就好理解了 原文http://www.haw-haw.org/node/1507 Generated by Jackxiang's Bo-blog 2.1.1 Release