首页 > 系统相关 >bash中处理Shell脚本中带有空格的变量

bash中处理Shell脚本中带有空格的变量

时间:2023-01-06 17:11:58浏览次数:36  
标签:Shell 文件名 处理 IFS echo 空格 rootDir bash

在批量处理文件时候使用下面的脚本发现含有空格的文件名并不能被正确处理:

#$1: 遍历的文件夹
rootDir=$1
cd $rootDir
allAudioFile=$(find $1 -name "*\.mp3")
for oneAudioFile in $allAudioFile
do
  mv -f $oneAudioFile  $rootDir
done

通过set -x将执行信息打印出来,发现可以执行到,但是执行过程提示找不到对应的文件名,mv对应的source文件并不是原本的文件名,通过对比发现原来是文件名中含有空格,导致在for循环的过程中并没有将完整的文件名取出来;

例如有文件a b.mp3这时候在for循环的时候会有下面的打印:

mv: cannot stat “./a” : No such file or directory

从上面的错误信息可以发现原本的文件名由于空格被打断了,因此需要在for循环处理的过程中识别到文件名是含有空格的,从而对文件名中的空格不做处理;

bash使用IFS变量进行分割,所以需要修改IFS的分隔方式进而重新隔离,即需要将"\n"换行处理作为处理方式:

#IFS默认为IFS=$' \t\n'
IFS=$(echo -en “\n\b”) IFS=$(echo -en “\n\r”)

上面的两种方式均可(使用Ubuntu16.04),其它也可以,只需要在处理的时候将"\n"作为其中一个标识即可,因为使用find命令或者其他命令会将结果以行的形式存放到变量中;

#$1: 遍历的文件夹
rootDir=$1
cd $rootDir
allAudioFile=$(find $1 -name "*\.mp3")
IFS_BACKUP=$IFS
IFS=$(echo -en "\n\b")
#IFS=$(echo -en "\n\r")
for oneAudioFile in $allAudioFile
do
  mv -f "$oneAudioFile"  $rootDir
done
IFS=$IFS_BACKUP

至此,bash脚本中对于含空格文件处理方式介绍完毕,当然要记得将原本的IFS内容保存下来,脚本跑完了将原本的内容放回去。

标签:Shell,文件名,处理,IFS,echo,空格,rootDir,bash
From: https://www.cnblogs.com/oboth-zl/p/17031040.html

相关文章

  • shell脚本让环境变量在当前shell下生效的方法
    chmod+xtest.shtest.sh:{exportLD_LIBRARY_PATH=./lib;nohup./exe&}./test.sh执行时会创建子shell,当前shell脚本的命令都会在子shell下运行;故而设置......
  • Shell指令统计代码行数
    Shell指令如下:获取每个文件内的代码行数,并在最后统计全部文件代码总行数(包含注释、空行)find.-name"*.vue"-or-name"*.ts"-or-name"*.js"-or-name"*.scss"|x......
  • Docker Remote API未授权访问+docker逃逸导致Getshell漏洞复现
    漏洞介绍Docker是一个开源的引擎可以轻松地为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署包......
  • linux shell 用curl 发邮件
    echo"From:someone1<[email protected]">somefile.txtecho"To:someone2<[email protected]>;someone3<[email protected]>;">>somefile.txte......
  • shell条件语句
    返回值$?=0$!上一次后台运行程序的pid[root@localhost~]#evalpingwww.baidu.com-c3;cd/etc/Unsetxing单分支if判断条件;then条件为真的分支代码fi......
  • Docker私有仓库以及Docker shell
    Docker搭建私有仓库公有云:比如百度云,dockerhub私有云:比如搭建到某个内网,docker搭建私有仓库:下载一个镜像docker默认使用的是dockerhubdocker仓库服务器就是docker注册服务......
  • Shell 传递参数
    我们可以在执行Shell脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推……实例以下实例我们向......
  • Shell 数组
    数组中可以存放多个值。BashShell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与PHP类似)。与大部分编程语言类似,数组元素的下标由0开始。Shell数组用括......
  • 代码随想录算法训练营第八天 |344.反转字符串 541. 反转字符串II 题目:剑指Offer 05.替
    344.反转字符串文章:代码随想录(programmercarl.com)视频:字符串基础操作!|LeetCode:344.反转字符串_哔哩哔哩_bilibiliclassSolution{public:voidreverseStri......
  • Tomcat弱口令爆破+war部署getshell
    影响版本Tomcat全版本环境搭建使用vulfocus中的tomcat-pass-getshell环境。漏洞复现访问manager后台提交用户名和密码后抓包,设置Authorization:BasicYWRtaW46YWRt......