需求說明
自己用的是windows電腦乏盐,也開啟了windows下面的linux子系統(tǒng),有時(shí)候需要在linux子系統(tǒng)里面操作一些文件,而這些文件的路徑是windows形式吟温,windows路徑是使用的反斜杠符號(hào)\幽告,而linux則使用的是斜杠/梅鹦,在路徑特別長的時(shí)候一個(gè)個(gè)的去修改這兩個(gè)符號(hào)會(huì)很麻煩;
另一方面冗锁,在linux子系統(tǒng)里面齐唆,windows下面的CDE盤是掛載在/mnt盤下面的,如下圖所示:
這里的cde分別對(duì)應(yīng)于windows里的CDE盤冻河,舉個(gè)例子箍邮,在windows里面的目錄是C:\Users\asus,那么對(duì)應(yīng)于linux里面該目錄就是/mnt/c/Users/asus芋绸,要是一個(gè)個(gè)去修改的話確實(shí)很麻煩媒殉,因此我決定寫一個(gè)shell腳本担敌,對(duì)windows路徑做一些簡單的處理摔敛,將其轉(zhuǎn)成linux路徑,也正好借此機(jī)會(huì)學(xué)習(xí)一下shell里面變量替換的相關(guān)操作全封。
代碼實(shí)現(xiàn)
在寫代碼之前需要搞清楚需求要點(diǎn)马昙。
我們的windows路徑是C:\Users\asus\Anaconda3
,其對(duì)應(yīng)的linux路徑是/mnt/c/Users/asus/Anaconda3
刹悴,將windows路徑轉(zhuǎn)換成linux路徑需要做如下操作:
- win路徑中的冒號(hào)需要去掉
- win路徑中的C需要變成小寫的c行楞;
- 需要在win路徑前面加上/mnt/;
- 需要將反斜杠\換成斜杠/土匀;
下面是具體代碼:
# usage: bash win2linux_path.sh "C:\Users\asus\Anaconda3"
win_path=$1 # 腳本的第一個(gè)參數(shù)就是windows路徑
#win_path="C:\Users\asus\Anaconda3" # 一個(gè)示例路徑
tmp_path=${win_path/:/} # 將冒號(hào)刪掉
tmp_path=${tmp_path//\\/\/} # 將\\替換為/
disk_id=${tmp_path:0:1} # 取出第一個(gè)字母子房,也就是C盤的C,冒號(hào)后面第一個(gè)0指的是從下標(biāo)為0的地方開始提取就轧,第二個(gè)冒號(hào)后面的1表示提取一個(gè)字母
disk_id=$(echo $disk_id | tr [:upper:] [:lower:]) # 大寫轉(zhuǎn)小寫
#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"
需要注意的是這里的參數(shù)需要加雙引號(hào),因?yàn)閘inux里面反斜杠表示轉(zhuǎn)義妒御,不加雙引號(hào)的話反斜杠無法傳入到變量中解愤。
輸出如下:
windows path is C:\Users\asus\Anaconda3
linux path is /mnt/c/Users/asus/Anaconda3
大功告成!
代碼中的要點(diǎn)總結(jié)
下面對(duì)上面代碼中的關(guān)鍵點(diǎn)做一下總結(jié)乎莉。
1. 變量的字符串替換
有兩種形式:
-
${var/a/b}
:將var
變量中第一次出現(xiàn)的a
替換成b
送讲; -
${var//a/b}
:將var
變量中所有的a
替換成b
;
舉個(gè)例子:
var="hello linux, I love programming"
echo "raw text is "$var
var1=${var/hello/hi} # 將hello替換成hi
echo "var1 is "$var1 # 輸出var1的值惋啃,這里用到的是字符串連接操作哼鬓,直接將兩個(gè)字符串并排放著就可以。
var2=${var/o/111} # 將第一次出現(xiàn)的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. 字符串的下標(biāo)使用
上面的代碼中需要將windows路徑里面的磁盤號(hào)取出來(也就是C:\Users\asus中的C)边灭,里面用到了字符串的下標(biāo)操作魄宏,注意linux里面的字符串下標(biāo)是從0開始的(好像只有R語言的下標(biāo)是從1開始的?記不得還有哪些語言的下標(biāo)是從1開始的了)存筏。
使用形式:${var:offset:length}
宠互,其中offset
指的是從下標(biāo)offset
開始往后截取味榛,一直取length
個(gè)字符,如果不指定length
予跌,那么將從offset
一直取到最后一個(gè)字符搏色。
舉個(gè)例子:
var="123456"
echo ${var:0:2} # 從0開始截取2個(gè)字符,輸出12
echo ${var:2:4} # 從下標(biāo)2開始截取4個(gè)字符券册,輸出3456
echo ${var:3} # 從下標(biāo)3開始截取到字符串的最后频轿,輸出456