需求说明
自己用的是windows电脑,也开启了windows下面的linux子系统,有时候需要在linux子系统里面操作一些文件,而这些文件的路径是windows形式,windows路径是使用的反斜杠符号\,而linux则使用的是斜杠/,在路径特别长的时候一个个的去修改这两个符号会很麻烦;
另一方面,在linux子系统里面,windows下面的CDE盘是挂载在/mnt盘下面的,如下图所示:
这里的cde分别对应于windows里的CDE盘,举个例子,在windows里面的目录是C:\Users\asus,那么对应于linux里面该目录就是/mnt/c/Users/asus,要是一个个去修改的话确实很麻烦,因此我决定写一个shell脚本,对windows路径做一些简单的处理,将其转成linux路径,也正好借此机会学习一下shell里面变量替换的相关操作。
代码实现
在写代码之前需要搞清楚需求要点。
我们的windows路径是C:\Users\asus\Anaconda3
,其对应的linux路径是/mnt/c/Users/asus/Anaconda3
,将windows路径转换成linux路径需要做如下操作:
- win路径中的冒号需要去掉
- win路径中的C需要变成小写的c;
- 需要在win路径前面加上/mnt/;
- 需要将反斜杠\换成斜杠/;
下面是具体代码:
# usage: bash win2linux_path.sh "C:\Users\asus\Anaconda3"
win_path=$1 # 脚本的第一个参数就是windows路径
#win_path="C:\Users\asus\Anaconda3" # 一个示例路径
tmp_path=${win_path/:/} # 将冒号删掉
tmp_path=${tmp_path//\\/\/} # 将\\替换为/
disk_id=${tmp_path:0:1} # 取出第一个字母,也就是C盘的C,冒号后面第一个0指的是从下标为0的地方开始提取,第二个冒号后面的1表示提取一个字母
disk_id=$(echo $disk_id | tr [:upper:] [:lower:]) # 大写转小写
#echo $disk_id
other_path=${tmp_path:1} # 路径中除了磁盘以外的部分
linux_path="/mnt/"${disk_id}${other_path} # 需要将/mnt/接在路径最前方
echo "windows path is "${win_path}
echo "linux path is "${linux_path}
将以上代码存入到win2linux_path.sh
脚本中,使用方法为:
bash win2linux_path.sh "C:\Users\asus\Anaconda3"
需要注意的是这里的参数需要加双引号,因为linux里面反斜杠表示转义,不加双引号的话反斜杠无法传入到变量中。
输出如下:
windows path is C:\Users\asus\Anaconda3
linux path is /mnt/c/Users/asus/Anaconda3
大功告成!
代码中的要点总结
下面对上面代码中的关键点做一下总结。
1. 变量的字符串替换
有两种形式:
-
${var/a/b}
:将var
变量中第一次出现的a
替换成b
; -
${var//a/b}
:将var
变量中所有的a
替换成b
;
举个例子:
var="hello linux, I love programming"
echo "raw text is "$var
var1=${var/hello/hi} # 将hello替换成hi
echo "var1 is "$var1 # 输出var1的值,这里用到的是字符串连接操作,直接将两个字符串并排放着就可以。
var2=${var/o/111} # 将第一次出现的o替换成111
echo "var2 is "$var2
var3=${var//o/111} # 将所有的o替换成111
echo "var3 is "$var3
上面的输出如下:
raw text is hello linux, I love programming
var1 is hi linux, I love programming
var2 is hell111 linux, I love programming
var3 is hell111 linux, I l111ve pr111gramming
2. 字符串的下标使用
上面的代码中需要将windows路径里面的磁盘号取出来(也就是C:\Users\asus中的C),里面用到了字符串的下标操作,注意linux里面的字符串下标是从0开始的(好像只有R语言的下标是从1开始的?记不得还有哪些语言的下标是从1开始的了)。
使用形式:${var:offset:length}
,其中offset
指的是从下标offset
开始往后截取,一直取length
个字符,如果不指定length
,那么将从offset
一直取到最后一个字符。
举个例子:
var="123456"
echo ${var:0:2} # 从0开始截取2个字符,输出12
echo ${var:2:4} # 从下标2开始截取4个字符,输出3456
echo ${var:3} # 从下标3开始截取到字符串的最后,输出456
网友评论