標籤:c a com 檔案 使用 string
1.shell變數
本地變數:
a=1 (等號兩邊不能出現空格)
唯讀變數:
readonly 變數名=變數值 (在使用過程中不能更改)
聲明變數:
linux給變數賦值時預設是字元或字串型,如果需要數值運算,需要事先聲明
declare 參數 變數名[=變數值]
declare的參數: -a:數組 -i:整型 -r:唯讀
設定整型變數,除了用declare -i聲明以外,還可以:
a=$(($a+1)) or a=$[a+1]
清除變數:
unset 變數名(唯讀變數無法清除)
訪問shell變數:
set 顯示所有的本地定義的shell變數
${a} 取變數a的值
echo 顯示變數
echo的參數:
無 不加參數列印完轉換到下一行
-n 列印完不轉換到下一行
從鍵盤讀入為變數賦值:
read [參數] 變數名
read 變數名 變數名 變數名 ...
如果不跟變數名,則輸入會賦給$REPLY
read參數:
-a 表示把輸入存入陣列變數名
-p 在賦值之前先顯示-p後的提示字串,如read -p"?" a 顯示:?input
環境變數:
匯出環境變數(可供外部調用):
export 變數名
位置參數變數:
當指令碼被調用時用來儲存指令碼的命令列參數
echo ${1},${2},...
位置參數移位:
shift [前移量],預設前移1
如:
shift 2 向左移動兩位,通常用在迴圈結構中
特殊變數:
$0:存放當前執行的指令檔名,包括路徑
$#:存放傳遞給指令碼的位置參數的個數
$*:存放所有傳遞給指令碼的參數
[email protected]:和$*一樣,但是每一個參數都用引號引起來
$$:存放當前的進程號
$!:存放後台啟動並執行最後一個進程的進程號
$?:存放最後一個執行完的指令碼或命令的退出狀態 0表示成功,非0表示有錯誤
引用:
雙引號:弱引用,對 $,`,\ 無效
單引號:強引用,任意特殊字元均被屏蔽
反斜線:轉義
變數替換:
${varname:-word} 若varname未定義或空則用word代替varname作為傳回值
${varname:=word} 若varname未定義或空則將word賦值給varname再返回
${varname:?message} 若varname未定義或空則將message作為錯誤資訊輸出
${varname:+word} 若varname已定義且不為空白則用word作為傳回值
${varname:offset} 將$varname中第offset個字元開始到結尾的字串返回,取尾串
${varname:offset:length}將$varname中第offset個字元開始,長度為length的字串返回,取子串
2.流程式控制制
順序結構:
nothing to say
條件測試:
test命令
檢查檔案狀態,判斷字串是否匹配,數值測試等操作
既可以用在分支結構中,又,可以用在迴圈結構中
test 測試條件
或
[ 測試條件 ](測試條件與左右方括弧之間需要有一個空格)
檔案測試
test [測試條件] FILE
-e 如果FILE存在
-s 如果FILE非空
-d 如果FILE是目錄
-f 如果FILE是普通檔案
-b 如果FILE是塊裝置檔案
-c 如果FILE是字元裝置檔案
-S 如果FILE是通訊端檔案
-L 如果FILE是符號串連檔案
-p 如果FILE是有名管道
-f 如果FILE具有讀許可權
-w 如果FILE具有寫入權限
-x 如果FILE具有執行許可權
-G 如果FILE是被有效組擁有
-O 如果FILE是被有效使用者所擁有
-k 如果FILE設定了sticky位
-u 如果FILE設定了set-user-id位
-g 如果FILE設定了set-group-id位
-N 如果FILE自上次訪問以來被修改過
FILE1 -nt FILE2 如果FILE1比FILE2新
FILE1 -ot FILE2 如果FILE1比FILE2舊
FILE1 -ef FILE2 如果FILE1是FILE2的硬串連檔案,二者指向同一個i節點
字串測試
string1 = string2 字串相等
string1 != string2 字串不相等
-n string1 字串非空
-z string1 字串為空白
數值測試
expr1 -eq expr2 運算式值相等
expr1 -ne expr2 運算式值不相等
expr1 -gt expr2 運算式1大於運算式2
expr1 -lt expr2 運算式1小於運算式2
expr1 -ge expr2 運算式1大於等於運算式2
expr1 -le expr2 運算式1小於等於運算式2
邏輯操作符
與 -a [ $a = "a" -a $b = "b" ] if($a=="a"&&$b=="b")
或 -o [ $a = "a" -o $b = "b" ] if($a=="a"||$b=="b")
非 ! [ ! a="a" ] if($a!="a")
分支結構:(if分支,case分支)
if分支結構:
if 條件測試1;then
條件測試1為真時的語句
[elif 條件測試2;then]
條件測試2為真時的語句
...
[else]
條件測試為假時的語句序列
fi
#如果條件測試語句與then在一行,那麼要用;與then分隔開
#條件測試語句與if,elif,else,then之間至少要有一個空格分開
#elif,else可選,else只可出現一次
#if可以嵌套
case分支結構:
case 值 in
模式1)
語句組1
...
;;
模式2)
語句組2
...
;;
......
*)
語句組n
esac
迴圈結構
for迴圈:
for 變數 in 值1 值2 ... 值n
do
語句1
語句2
...
done
與c語言相似的格式
for((i=1;i<=6;i++))
do
...
done
while迴圈:
while 條件
do
語句1
語句2
...
done
select迴圈:
select name in [ in list ]
do
語句列表
done
3.shell函數
函數的定義:
function funcname
{
shell commands
}
or
funcname()
{
shell commands
}
參數的傳遞:
與指令碼的參數相似,使用$1,$2...
如
#!/bin/bash
my_func()
{
a=$1
echo $a
}
read input
my_func() $input
函數的返回可以使用:
return