Windows路径转成Linux子系统的路径

需求说明

自己用的是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路径需要做如下操作:

  1. win路径中的冒号需要去掉
  2. win路径中的C需要变成小写的c;
  3. 需要在win路径前面加上/mnt/;
  4. 需要将反斜杠\换成斜杠/;

下面是具体代码:

# 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. 变量的字符串替换

有两种形式:

  1. ${var/a/b}:将var变量中第一次出现的a替换成b
  2. ${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
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值