IDEA配置maven引入包時報Unable to import maven project: See logs for details 錯誤的解決辦法
shell介紹
shell介於核心與使用者之間,負責命令的解釋。
shell型別
[root@localhost ~]# cat /etc/shells 檢視shell種類 /bin/sh 是bash shell的一個快捷方式 /bin/bash bash shell 是大多數Linux預設的shell,功能齊全 /usr/bin/sh /usr/bin/bash /bin/tcsh 是csh的增強版 ,完全相容csh /bin/csh 具有C語言風格的一種shell
/sbin/nologin 非互動 ,不能登入作業系統
shell指令碼格式
#!/bin/bash
//第一行 #!魔法字元,指定程式碼的執行程式,即告訴系統用什麼直譯器(用那種shell)
//指令碼基本資訊描述
#name:名字
#describe:描述用途
#Path:存放路徑
#usage:用法
#update:更新時間
//指令碼具體內容
.......
shell指令碼執行方法
標準執行:
shell指令碼必須要有可執行許可權
chmod +x 指令碼檔案 (加可執行許可權)
絕對路徑執行:/shell10/shell1.sh
相對路徑執行:./shell1.sh
非標準執行:
shell指令碼可以不要可執行許可權
bash shell1.sh
bash -x 指令碼名 檢視指令碼執行過程
bash -n 指令碼名 檢視指令碼是否有語法錯誤
source shell1.sh
. shell1.sh(.後有個空格)
****除了絕對路徑執行外,其他的執行命令必須在指令碼所在目錄下執行
bash的基本特性
常見快捷鍵
ctrl +c 終止某個操作
z 將前臺執行的程式掛到後臺
d 退出 等於exit
1 清屏等於clear
a 游標移動到命令列最前端
e 游標移動到命令列最後端
u 刪除游標前所有字元
k刪除游標後所有字元
r 搜尋歷史命令(輸入關鍵字即可)
常用萬用字元
* :匹配0或多個字元
? :匹配任意單個字元
[list] :匹配[list]中的任意單個字元或者一組單個字元 file[abc] 匹配filea或fileb或filec, file[1-47] 匹配file1到file4和file7 (-必須後邊的大於前邊的)
[!list] :匹配除[!list]中的任意單個字元 或一組單個字元[!abc] 匹配除filea、fileb、filec 外的任意file加一個字元
{string1,string2,.......} :匹配string1,string2 ,或更多字元 file{3..6}(必須要兩個點) 匹配file3 file4 .....file6 or file{3,4,5,6}
例子:有兩個檔案file1 ,file11
ls -l fi* 或者 flile*能匹配到兩個檔案 ls -l file1* 能匹配到file1
但ls -l file1? 匹配不到file1 且 ls -l fil? 匹配不到連個檔案 只有ls -l file? 匹配到file1 ls -l file1?匹配到file11
bash中的引號
雙引號"" :會把引號內的內容當成整體來看,允許通過$符合引用其他變數值
單引號'' : 會把引號內的內容當成整體來看,禁止引用其他變數值,shell中特殊符號都被視為普通字元
反撇號`` :反撇號和$()一樣,引號或括號裡的命令會優先執行,如果存在巢狀,反撇號不能用
echo "$(date +%F)" = echo "`date +%F`"
echo `echo "`date +%F`"` 這就是巢狀,是不允許的會報錯,可以改為 echo $(echo "`date +%F`")
重新命名檔案
mv 只能重新命名單個檔案 (多個就會當成移動檔案)
把file1-3重新命名為text1-3
rename file text file?
把file11-13 重新命名為text11-13
rename file1 text file1? or rename file text file??
變數的定義
1、變數的分類
本地變數:當前使用者自定義的變數,當前程序中有效,其他程序即當前的子程序無效。
環境變數:當前程序有效,並且能夠被子程序呼叫
全域性變數:全域性所有使用者和程式都能呼叫,且繼承、新建的使用者也能呼叫。
檢視當前使用者的環境變數: env |grep ^A
檢視當前使用者的所有變數:set
臨時將臨時(本地)變數變成環境變數:export A=hello
永久生效:vim /etc/profile 末尾加上 export A=hello 重新載入此檔案source /etc/profile
第三方軟體配置環境變數
which 軟體名 找到命令所在檔案
vim /etc/profile 末尾加上
export PATH="$PATH:/usr/local/mysql/bin:第二個路徑" (加export是環境變數,不加則是本地變數)
系統變數(內建bash中的變數):shell本身已經固定好了其名字和作用
$? :上一條命令執行後的返回狀態,返回值為0表示正常,非零為出異常或出錯
0 命令成功結束
1 通用未知錯誤
2 誤用shell命令
126 找到命令,但命令不可執行(許可權不夠)
127 沒找到命令
128 無效退出引數
128+x Linux 訊號x的嚴重錯誤
130 Linux 訊號2 的嚴重錯誤,即命令通過SIGINT(Ctrl+C)終止
255 退出狀態碼越界
$$ :當前所在程序的程序號 kill -9 `echo $$` 殺死當前程序
$! :後臺執行的最後一個程序號 echo $!
!$:呼叫最後一條命令歷史中的引數
!!:呼叫最後一條歷史命令
$#:指令碼後面接的引數個數
$*:指令碼後面所有引數,引數當成一個整體輸出,每一個變數引數之間以空格隔開
$@:指令碼後面所有的引數,引數是獨立的,也是全部輸出
$0:當前執行的程序/程式名
$1~$9:位置引數變數
${10}~${n} :擴充套件位置引數變數,第十個位置變數必須用{}括起來
變數定義
1、預設情況下,shell裡定義變數是不分型別的,可以給變數賦予任何型別的值;等號兩邊不能有空格,對於有空格的字串作為賦值時,要用引號引起來。變數名=變數值
2、變數的獲取方式:$變數名
A=123456
echo $A or echo ${A}
都顯示:123456
echo ${變數名:從第幾個字元擷取:擷取的字元個數}
echo ${A:2:3} ***第二段為下標,從0開始。下標0對應A中第一個字元,第三段表示顯示幾個字元***
顯示為:345
unset 變數名 :刪除變數
變數定義規則
shell中變數名區分大小寫,A =123 a=456 這是兩個變數。
shell中變數重新賦值後會覆蓋,先定義A=123,後定義A=456 最後A的變數值為456
shell中變數名不能以數字開頭,也不能有特殊字元,如? $ *等
shell中可以把一個命令的執行結果賦值給一個變數
自己定義有型別的變數
declare 選項 變數名=變數值
- -f 僅顯示函式。
- -r 將變數設定為只讀。
- -x 指定的變數會成為環境變數,可供shell以外的程式來使用。相當於用export 變數名 進行匯出
- -i [設定值]宣告變數為整數型 "+r"則是取消變數所設的屬性。
- -a 指定為索引陣列(普通陣列)
- -A 指定為關聯陣列
如:declare -r A=123 :設定變數為只讀,此時,想要再設定A變數進行覆蓋是不行的。unset A也不能刪除變數
取消只讀:
# cat << EOF| gdb
> attach $$
> call unbind_variable("test") test為變數名
> detach
> EOF
陣列
普通陣列:只能使用整數作為資料索引(元素下標)
關聯陣列:可以使用字串作為陣列索引(元素的下標)
普通陣列定義:用括號來表示數字,陣列元素(變數)用空格符號分割開,
定義陣列的一般形式為:
變數名=變數值
array[0]=v1 陣列下標0賦值為v1
array[1]=v2 陣列下標1賦值為v2
array[2]=v3
or
array=(v1 v2 v3) 陣列下標0 ,1, 2,賦值為 v1 ,v2, v3
array1=(`cat /etc/passwd`) or array1=($(cat /etc/passwd))把passwd中每一行賦值給array1陣列
array2=(1 2 3 "hello word" [10]=linux) ""裡為一個元素 []=元素 :指定元素下標
echo ${array[*]} :獲取陣列所有元素,也可以用@
echo ${array[1]} :獲取陣列下標1的元素
echo ${array[*]:1:2} :獲取陣列從下標1開始,後兩個下標的元素,即下標1下標2的值,是v2 v3
陣列變數也會覆蓋(只會覆蓋再定義的下標的元素)
如:再定義 array[0]=m1 array[10]=m2
則陣列array='(array[0]=m1 array[1]=v2 array[2]=v3 array[10]=m2)'
獲取數組裡的元素個數:echo ${#array[*]} /陣列長度
獲取數組裡有元素值的下標號 :echo ${!array[*]}
關聯陣列定義:
首先宣告關聯陣列
declare -A array10
陣列賦值:
陣列名[索引下標]=變數值
一次賦一個值:
array10[linux]=one
array10[java]=two
一次賦多個值:
array10=([linux]=one [java]=two [name]="feng xue")
檢視關聯陣列:
declare -A
echo ${array10[*]} :獲取關聯陣列的所有元素,其是無序的 。@也可
echo ${array10[name]} :獲取固定陣列下標的元素
echo ${#array10[*]} :獲取關聯數組裡的元素個數/陣列長度
echo ${!array10[*]} :獲取關聯數組裡的下標值
互動式定義變數的值 read 讓使用者去定義變數的值
-p 定義提示資訊
-n 字元數(限制變數值的字元)
-s 不顯示
-t 超時(預設單位為秒)(限制使用者輸入變數的超時時間)
read -p "提示資訊如:input your name:" name
read -s -p "input your passwd:" passwd 你輸入的字元不在螢幕上顯示
read -n 3 "input your name:" name 只能輸入三個字元如abc
read -t 3 "input your name:" name 三秒後退出輸入介面,三秒內沒有回車確認不會給變數賦值
#read A B
hello world
上邊A賦值hello B賦值world
#read A B < 1.txt 從檔案中獲取值 1.txt內容為hello world
上邊A賦值hello B賦值world
注意:read A B 賦值多個變數時 只有遇到空格後才會分別賦值兩個變數,若1.txt內容為hello:world 變數A值為hello:world B為空
其他變數(擴充套件)
1、取出一個目錄下的目錄和檔案:dirname和basname
2、變數內容的刪除和替換
一個"%"代表從右往左去掉一個/key/
兩個"%%"代表從右往左去掉最大的一個/key/
一個"#"代表從左往右去掉一個/key/
兩個"##"代表從左往右去掉最大的一個/key/
${變數名#關鍵字元} 如果變數內容從頭開始的資料符合"關鍵字元",則將符合的最短資料刪除
${變數名##關鍵字元} 如果變數內容從頭開始的資料符合"關鍵字元",則將符合的最長資料刪除
${變數名%關鍵字元} 如果變數內容從尾開始的資料符合"關鍵字元",則將符合的最短資料刪除
${變數名%%關鍵字元} 如果變數內容從尾開始的資料符合"關鍵字元",則將符合的最長資料刪除
#A=/root/desktop/shell/mem.txt 定義變數為此目錄
#dirname $A 取出目錄
/root/desktop/shell
#basname $A 取出檔案
mem.txt
#url=www.taobao.com
#echo ${#url} 獲得變數長度
#echo ${url#*.} #從左往右最短匹配 *.表示關鍵字
taobao.com
#echo ${url##*.} #從左往右最長匹配
com
#echo ${url%.*} #從右往左最短匹配
www.taobao
#echo ${url%%.*} #從右往左最長匹配
www
替換
${變數名/舊字串/新字串} |
表示若變數內容符有舊字串則第一個舊字串會被新字串替換 |
${變數名//舊字串/新字串} |
表示若變數內容有舊字串則全部舊字串會被新字串替換 |
#echo ${url/taobao/wangyi}
www.wangyi.com
#echo ${url//o/i}
www.taibai.cim
Shell變數的替代
給Shell變數設定預設值的格式為${變數名-新的變數值}or${變數名=新的變數值}
,如果變數名沒有被賦值,會使用新的變數值替代,如果已被賦值(包括空值),則該值不會被替代。
${變數名:-新的變數名}
這樣如果變數為空值也會被替代
簡單的四則運算
算術運算:預設情況下,shell就只能支援簡單的整數運算
+ - * / % (/求商 %取餘數)
bash shell中算數運算有四種方式
1、使用$(()) echo $((5/10)) 得0 echo $((5%10)) 得5
2、使用$[] echo $[5*10] 50 echo $[5/10] 0
3、使用expr 外部程式 exper 3 +(-,/,%) 2 expr 2 \* 3 等於6 乘號比較特殊需要轉義一下 數字 符號 數字間得有空格,不然就直接輸出字串:expr 2*3 輸出:2*3
4、使用let命令 let n=n+(-,%,/,*)1 等於 let n+(-,%,/,*)=1 let n=n**2(求n的2次方) let n=n**3(4,5,6....)(n的三(4,5,6...)次方)
如何算小數 bc
echo 1+1.5 |bc (跟bc的話,數字 符號 數字間可以沒有空格)
還可以直接輸bc進入其中計算
[root@localhost ~]# bc bc 1.06.95 Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc. This is free software with ABSOLUTELY NO WARRANTY. For details type `warranty'. 2.4*4.5 (輸入計算) 10.8 (結果) 5/2 2 ^C (interrupt) Exiting bc.
i++與++i的區別
對變數值無影響:i=1,j=1,let i++ =let j++ 值是一樣的
對錶達式的值有影響:
let x=i++ i++ 先賦值後運算(先把i的值給x,i再加一)
let y=++j ++j 先運算後賦值 (j先加一。再把j的值給y)
上邊i=2 j=2 但x=1,y=2