linux shell 部分问题解决方法
1. 判断shell里判断字符串是否包含某个字符
a. 可以用正则式匹配符号 “=~”
举例:str="this is a string"
要想在判断str中是否含有"this"这个字符串,下面的语句是可行的
[[ $str =~ "this" ]] && echo "\$str contains this"
[[ $str =~ "that" ]] || echo "\$str does NOT contain this"
2. shell 根据路径字符串截取文件和文件名
比如从路径里取出 文件名或者判断中间某一个文件夹是否存在,不存在就创建新文件夹等。
a. 使用${ }
规则是:
#表示左边,第一个,##表示从左边起最后一个
%表示右边,第一个,%%表示从右边最后一个
/和*的使用配合左右,当用到左边时,“ * ”在“/ ”的左边,用到右边时,“ * ”在“ / ”的右边。(“ * ”可以看成是所有,“ * ”在“ / ”左边,表示要把“ / ”左边的全部去掉,加一个“#”去一个,加两个“##”意思是去掉从左边数最后一个的“ / ”的全部左边字符)
举例:${var#*/} :去掉从左边起第一个出现的“ / ”和它的左边的内容。
1 path=“one/two/three” 2 new_path=${path#*/} 3 echo $new_path
结果: two/three
举例:${var%%/*}:去掉从右边数最后一个“ / ”及其右边的内容 。
1 path=“one/two/three” 2 new_path=${path%%/*} 3 echo $new_path
结果:one
--除了和“ / ”配合使用,也可以和其他特殊字符进行匹配使用--
比如" . " : 举例 ${var##*.} :表示从去掉左边起最后一个" . "以及它左边的全部内容。即返回从左边数最后一个" . "的右边的内容。
b. basename和 dirname 【此处参考 https://www.jb51.net/article/103875.htm】
${var }其实并不是为了截取文件目录和文件名而存在的,但basename和dirname他们是。
1)、basename
该命令的作用是从路径中提取出文件名,使用方法为basename NAME [SUFFIX]。
1)从路径中提出出文件名(带后缀),例子如下:
2)从上面命令的用法中可以看到,后缀(SUFFIX)是一个可选项。所以,若只想提取出文件名file,而不带有后缀,还可以在变量的后面加上后缀名,例子如下:
2、dirname
该命令的作用是从路径中提取出目录名,使用方法为 dirname NAME
使用例子如下:
这样就提取出了file.txt文件所在的目录。
注:该命令不仅能提取出普通文件所的目录,它能提取出任何文件所在的目录,例如目录所在的目录,如下:
它提取出了目录dir2所在的目录dir1.
3. shell遍历带有特殊字命名标题的文件和文件夹
linux处理包含空格和特殊字符的文件名可以参考:https://blog.csdn.net/chengxuyuanyonghu/article/details/46820219
shell处理包含空格的文件名时,echo直接打出来会把空格当做两个文件夹来处理。
我用的方法是在脚本中替换默认的ifs(internal field separator),脚本运行完之后恢复:
SAVEIFS=$IFS #更改ifs为换行 IFS=$(echo -en "\n\b") ##执行脚本 IFS=$SAVEIFS
shell中的IFS解释参考:https://blog.csdn.net/whuslei/article/details/7187639