shell腳本學習筆記之常見語法結構用法
一,變量
1.變量賦值和替換
語法:variable=value
variable=“value1 value2”
echo $variable/$"{variable}" 屏幕上顯示賦值
echo $"{variable+b}" 將已經賦值的變量重新設值,臨時生效
echo $"{variable:=value} 屏幕上顯示value(前提是value沒有被賦值)
echo $"{variable:-value} 屏幕上顯示value(value未被賦值,value臨時賦值)
echo $"{variable?}" 用於查看變量是否被賦值,賦值是什麼
設置只讀變量(查看所有的只讀變量用readonly即可)
variable=value
readonly=value 任何用戶不允許對變量variable重新設置變量或unset變量
declare/typeset
2.無類型shell變量
*****shell不需要聲明變量類型,通過上下語句來自動識別,只支持整型和字符型
默認爲字符型,如果沒有給變量賦值而帶入到語句中,會根據上下文自動給變量賦值,默認爲空(字符),如果上下文分析出爲一個算法,
則將變量賦值爲0
3.環境變量
3.1定義和清除變量
定義環境變量的基本格式
ENVIRON-VARIABLE=value
聲明環境變量
export ENVIRON-VARIABLE
例子:
[root@node1 ~]# export APP
[root@node1 ~]# echo "APP"
[root@node1 ~]# echo "$APP"
/usr/local
查看所有的環境變量 env
unset清除環境變量
3.2 重要環境變量
PWD/OLDPWD
在PATH中添加新目錄
export PATH="/new directory":$PATH
HOME
echo $HOME 顯示當前用戶的家目錄
SHELL
USER和UID 當前用戶
PPID 進程號
PS1和PS2
IFS 指定域分隔符
3.環境變量配置文件
.bash_profile 作用於用戶登錄後啓動的shell(可以執行配置文件中登錄後的命令)
.bashrc 作用於子shell(子shell中使用的命令,)
.bash_logout 作用於註銷時執行配置文件中的命令
父進程 子進程
環境變量和本地變量的異同點
環境變量的父shell可以向子shell傳遞
本地變量的父shell 不能傳遞
而環境變量和本地變量的子shell都不能向父shell進程傳遞
_____________________________________________________________________
[root@node1 scripts]# cat father.sh
#!/bin/bash |
#輸出父進程號
echo "Father Process ID is $$"
|
#定義本地變量並輸出 |
localvar="Define a local variable."
echo "localvar=$localvar" |
#定義環境變量並輸出
ENVVAR="Define a environment variable."
export ENVVAR
echo "ENVVAR=$ENVVAR"
#調用child.sh腳本,即創建子進程
$PWD/child.sh
#child.sh執行完畢,輸出相關變量值
echo "Return to father process: $$"
echo "localvar=$localvar"
echo "ENVVAR=$ENVVAR"
[root@node1 scripts]# cat child.sh
#child.sh:該腳本輸出自身進程號及父進程號、重新定義本地變量和環境變量
#!/bin/bash
#輸出自身進程號及父進程號
echo "Chile Process ID is $$"
echo "My Father Process ID is $PPID"
#輸出本地變量和環境變量的當前值
echo "localvar=$localvar"
echo "ENVVAR=$ENVVAR"
#重新定義本地變量和環境變量
localvar="Redefine this ocal variable."
ENVVAR="Redefine this environment variable."
echo "localvar=$localvar"
echo "ENVVAR=$ENVVAR"
[root@node1 scripts]# ./father.sh
Father Process ID is 5429
localvar=Define a local variable.
ENVVAR=Define a environment variable.
Chile Process ID is 5430
My Father Process ID is 5429
localvar=
ENVVAR=Define a environment variable.
localvar=Redefine this ocal variable.
ENVVAR=Redefine this environment variable.
Return to father process: 5429
localvar=Define a local variable.
ENVVAR=Define a environment variable.
_____________________________________________________________________
4.參數
$N 賦值變量
$# 變量個數
$*/$@ 列出所有變量
$$ 執行的shell進程號
$? 顯示是否錯誤0/1
__________________________________________________
[root@node1 scripts]# ./a.sh a b c d e f j
the scripts is ./a.sh
the part1 #1 a
the part2 #2 b
all parts a b c d e f j
the pats are 7
the error 0
the shell process 4898
[root@node1 scripts]# cat a.sh
#!/bin/bash
echo "the scripts is $0"
echo "the part1 #1 $1"
echo "the part2 #2 $2"
echo "all parts $*"
echo "the pats are $#"
echo "the error $?"
echo "the shell process $$"
_________________________________________________
==========================================================================
二、引用
"" 引用除$,`,\外所有字符
'' 引用所有字符
`` shell解釋爲系統命令
\ 轉義符,即屏蔽下一個字符的特殊意義
1. 全引用和部分引用
”“ ‘’
2.命令替換
`linux命令`
$(linux命令)
需要理解 x y ”x y“
``和$()的區別
3.轉義符
在使用echo時
$''=-e
a=1
a="1 2”
**************************************************************************
$?
0表示運行成功
非0表示失敗
echo $? 0或其他------ 用於測試判斷語句
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
三.退出狀態
1.測試結構
test
格式:test expression
2.整數比較運算符
整數比較------ 用於測試判斷語句或循環語句
-eq
le
ge
lt
gt
ne
3字符串運算符----- 用於測試用戶輸入是否爲空或比較字符串變量
string 測試string是否不爲空
-n string 測試是否不爲空
-z string 測試是否爲空
string1=string2 測試string1和string2是否相等
sring1!=string2 測試string1和string2是否不相等
格式 [ "string1" =/!= string2 ]
4.文件操作符
file 爲目錄,文件,或文件路徑
-d file 測試file是否爲目錄
-f 測試file是否存在
-r 測試file是否爲普通文件
-s 測試file是否是進程可讀文件
-w 測試file是否是進程可寫文件
-x 測試file是否是進程可執行文件
-L 測試file的長度是否不爲0
-e 測試file是否符號鏈接
格式 [ -d file ]
邏輯運算符
!expression 非 如果爲假,則test爲真
expression1 -a expression2 與 如果都爲真,則test爲真
expression1 -o expression2 或 如果有一個爲真,則test爲真
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
三.判斷
1.簡單的if結構
if expression
then
command
command
...
fi
2.exit命令
exit status
3.if/else結構
if expression1
then
command
...
command
else
command
...
command
fi
4.if/else嵌套語句
if expression1
then
if expression2
then
command
command
...
else
command
command
...
fi
else
if expression3
then
command
command
...
else
command
command
...
fi
fi
5.if/elif/else結構
if expression1
then
command
command
...
elif expression2
then
command
command
...
elif expresionN
then
command
...
command
else
command
...
command
fi
6.case結構
caase variable in
value1)
command
...
command;;
value2)
command
...
comand;;
...
valueN)
command
...
command;;
*)
command
...
command;;
esac
++++++++++++++++++++++++++++++++++++++++++++++++++++
四、運算符
1.算術運算符
運算符 舉例 結果
+(加運算) 3+5 8
-(減運算) 5-3 2
*(乘運算) 5*3 15
/(除運算) 8/3 2
%(取餘運算) 15%4 3
**(冪運算) 5**3 125
算術複合賦值運算符
運算符 舉例 等價表達式
+= v+=5 v=v+5
-= v-10 v=v-10
*= v*=5 v=v*5
/= v/=3 v=v/3
%= v%=5 v=v%5
2.位運算符
運算符 舉例 解釋或value值
<<(左移) value=4<<2 4左移2位,value值爲16
>>(右移) value=8>>2 8右移2位,value值爲2
&(按位與) value=8&4 8按位與4,value值爲0
|(按位或) value=8|4 8按位或4,value值爲12
~(按位非) value=~8 按位非8,value值爲-9
^(按位異或) value=10^3 10按位異或3,value值爲9
複合運算符
運算符 舉例 等價表達式
<<= value<<=2 value=value<<2
>>= value>>=2 value=value>>2
&= value&=4 value=value&4
|= value|=4 vale=value|4
^= value^=3 value=value^3
4.自增自減運算符
++++++++++++++++++++++++++++++++++++
循環
1.列表for循環
for variable in {list}
do
command
command
...
done
2.不帶列表for循環
for variable
do
command
command
...
done
3.類c風格的for循環
for(( expr1;expr2;expr3 ))
do
command
command
...
done
++++++++++++++++++++++++++++++++++++++++
while循環
while expression
do
command
command
...
done
1.計數其控制的while
couter = 1
while expression
do
command
...
let command to operate counter
command
...
done
2.結束標記控制的while循環
read variable
while [[ "$variable" != sentinel ]]
do
read variable
done
3.標誌控制的while循環
signal=0
while (( singal !=1 ))
do
...
if expression
then expression
signal=1
fi
...
done
4.命令行控制的while循環
while [[ "$*" != ""]]
do
echo "$!"
shift
done
while [[ "$#" -ne 0 ]]
++++++++++++++++++++++++++++++++++++++++++++++++++++++
until循環
until expression
do
command
command
...
done