shell基礎

#
for skill in Ada Coffe ACtion Java;do
	echo "I am good at ${skill}Script"
done

#定義變量時,=左右不能有空格。定義變量時沒有$,使用時必須有$
aa="http://www.w3school.cc"

#readonly 表示只讀屬性。
readonly aa
#aa="Http://www.baidu.com"
# unset 變量刪除
unset aa
echo $aa
# 單引號,不支持變量和轉義。雙引號支持變量和轉義
k="Keytty"
str1='111111111${k}'
str2="111111111${k}"
echo $str1
echo $str2

#拼接字符
your_name=$k
greeting1="hello,"$your_name"!"
greeting2="hello,"${your_name}"!"
echo $greeting1
echo $greeting2

#獲取字符串長度
string="abc"
echo ${#string}
#提取字符串
string="runoob is a site"
echo ${string:1:4}
#查找子字符串。查找is或s的位置。輸出8

echo `expr index "$string" is` 
#定義數組 array_name=(value0 value1 value2 value3).用空格分開
array_name=(value0 value1 value2 value3)
echo ${array_name[1]}
#使用@ 獲取數組中所有元素
echo ${array_name[@]}
#獲取數組長度
echo ${#array_name[@]}
echo ${#array_name[*]}
#獲取單個元素長度
echo ${#array_name[1]}


#獲取參數爲$0,$1,$2,,,,其中$0 表示執行的文件名.:!sh a.sh China Hangzhou
echo "Shell 傳遞參數實例:"
echo "執行文件名:$0"
echo "第一個參數:$1"
echo "第二個參數:$2"
echo "傳遞腳本的參數個數:"$#
echo "傳遞腳本的參數:"$* #$*把參數看成"China Hangzhou",$@把參數看成"China""Hangzhou"
echo "腳本運行當前的進程號:"$$
echo "後臺運行的最後一個進程號:"$!
echo "傳遞腳本的參數:"$@
echo "顯示shell使用的當前選項"$-  #打印  hB 什麼意思?
echo "顯示最後命令的退出狀態:"$? #0 沒有錯誤,其他任何值表示有錯誤
# 演示 $*  和  $@
echo "-------------\$*-----------" # 這裏一定要加轉義,否則就輸出參數了
for i in "$*";do
	echo $i
done
echo "-------------\$@-----------"
for i in "$@";do
	echo $i
done


#只支持一維數組,初始化不需要定義數組大小,由0開始
my_array=(A B "C" D)
#my_array[4]="ChinaHangZhou"
echo ${my_array[2]}
echo ${my_array[3]}

#chmod +x a.sh

#expr表達式計算工具,完成表達式求值操作
val=`expr 2 + 2` #表達式和運算符之間要有空格,完整的表達式需要用``包括起來
echo "兩數之和爲:"$val
#條件表達式必須放在方括號之間,如[ $a==$b ],括號與變量之間有空格
a=10
b=20
val=`expr $a + $b`
echo '$a + $b = '$val
val=`expr $a = $b`
echo '$a - $b = '$val
val=`expr $a \* $b` #注意乘號面前要加轉義字符\
echo '$a * $b = '$val
val=`expr $a / $b`
echo '$a / $b = '$val
val=`expr $a % $b`
echo '$a % $b = '$val
if [ $a == $b ] #注意這裏要寫成$a == $b 
then
	echo '$a==$b'
fi
if [ $a != $b ]
then
	echo '$a!=$b'
fi
#Mac中expr表達式爲$((表達式))乘號不需要轉義符號\


#關係運算符
#只支持數字,不支持字符串,除非字符串是數字
# -eq :check if equal, [ $a -eq $b ]
# -ne :check if no equal, [ $a -ne $b ]
# -gt :check if greater than, [ $a -gt $b ]
# -lt :check if less  than, [ $a -lt $b ]
# -ge :check if greater than or equal , [ $a -ge $b ]
# -le :check if less than or equal , [ $a -le $b ]

# 布爾運算
# ! 非運算符 [ !false ]
# -o 或運算符  [ $a -lt 20 -o $b -gt 100 ]
# -a 與運算符  [ $a -lt 20 -a $b -gt 100 ]
a=10
b=20
if [ $a != $b ]
then
	echo "$a != $b, not equal!"
else
	echo "$a == $b, equal!"
fi
if [ $a -lt 100 -a $b -gt 25 ]
then
	echo "$a -lt 100 -a $b -gt 25: return true"
else
	echo "$a -lt 100 -a $b -gt 25: return false"
fi
if [ $a -lt 100 -o $b -gt 25 ]
then 
	echo "$a -lt 100 -o $b -gt 25:return true"
else
	echo "$a -lt 100 -o $b -gt 25:return false"
fi
#邏輯運算符
# && 邏輯AND [[ $a -lt 100 && $b -gt 100 ]] return false
# || 邏輯OR  [[ $a -lt 100 || $b -gt 100 ]] return true
if [[ $a -lt 100 && $b -gt 100 ]]
then 
	echo "[[ $a -lt 100 && $b -gt 100 ]]:return true"
else
	echo "[[ $a -lt 100 && $b -gt 100 ]]:return false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then 
	echo "[[ $a -lt 100 || $b -gt 100 ]]:return true"
else
	echo "[[ $a -lt 100 || $b -gt 100 ]]:return false"
fi

# 字符串運算符
# a="abc"
# b="efg"
# = 檢查2個字符串是否相等,[ $a = $b ] false
# != 檢查2個字符串是否不相等, [ $a != $b ] true
# -z 檢查字符串長度是否爲0,爲0返回true,[ -z $a ] false
# -n 檢查字符串長度是否爲0,不是0,返回true,[ -n $a ] true
# str 檢查字符串是否爲空,不爲空返回true  [ $a ]true
a="abc"
b="efg"
if [ $a = $b ]
then
	echo "$a = $b : return true"
else
	echo "$a = $b : return falsee"
fi
if [ -z $a ]
then
	echo "-z $a : 字符串長度爲0,返回true"
else
	echo "-z $a : 字符串長度不爲0,返回false"
fi
if [ $a ]
then
	echo "$a :字符串不爲空"
else 
	echo "$a :字符串爲空"
fi

#文件測試運算符
# -b file :檢查文件是否塊設備文件,是則返回true [ -b $file ]
# -c file :檢查文件是否字符設備文件,是則返回true
# -d file :檢查文件是不是目錄,是則返回true
# -f file :檢查文件是不是普通文件,是則返回true
# -g file :檢查文件是不是設置了SGID位,是則返回true
# -k file :檢查文件是否設置了粘着位(Sticky Bit),是則返回true
# -p file :檢查文件是不是管道,是則返回true
# -u file :檢查文件是不是設置了SUID位,是則返回true
# -r file :檢查文件是不是可讀,是則返回true
# -w file :檢查文件是不是可寫,是則返回true
# -x file :檢查文件是不是可執行,是則返回true
# -s file :檢查文件是不是爲空(文件大小是不是大於0),不空則返回true
# -e file :檢查文件(包括目錄)是不是存在,是則返回true
file=$0
if [ -r $file ]
then
	echo "$file :can read"
else
	echo "$file :cannot read"
fi
if [ -w $file ]
then 
	echo "$file:can write"
else
	echo "$file :cannot write"
fi
if [ -s $file ]
then
	echo "$file: length>0"
else
	echo "$file:length=0"
fi
if [ -e $file ]
then
	echo "$file:exists"
else
	echo "$file:not exists"
fi

#echo 命令
#打印"需要加轉義字符
echo "打印字符\"是需要轉義字符\\的"
#read 命令從標準輸入中讀取一行
echo "Please enter input:"
#read name
echo "You Enter \"$name\""

# -e 開啓轉義
echo -e  "Ok,換行\n換行結束"
echo -e "Ok,不換行\c"

#顯示日期
echo `date`

# for 循環
for var in item1 item2 itemN
do 
	echo $val
done
for loop in 1 2 3 4 5
do
	echo "The value is:$loop"
done
for str in "This is str1" "This is str2"
do
	echo $str
done
# while 
int=1
while (( $int <= 5 )) #注意空格,注意這裏是2個(())
do
	echo "This is while,int=$int"
	let "int++"
done
#echo "Enter <Ctrl-D> to quit."
#echo -n 'Enter your favorate film:'
#while read film
#do
#	echo "Yes,$film is a good film!"
#	echo "Enter <Ctrl-D> to quit."
#	echo -n 'Enter your favorate film:'
#done

# until 循環 , 一直執行,直到條件爲真時停止
myvar=1
until [ $myvar -gt 10 ]
do 
	echo "This is until,myvar=${myvar}"
	myvar=$(( $myvar + 1 ))
done

myvar=1
while [ $myvar -gt 10 ] # 一直執行,直到條件爲假時停止
do
	echo "This is while,myvar=${myvar}"
	myvar=$(( $myvar + = ))
done

# case  
for item in item1 item2 item3
do
	case $item in
		item1)  #注意要使用 item1)括號
			echo "This is case item1:$item"
			;; #注意本條case命令序列完成後已;;結束
		item2)
			echo "This is case item2:$item"
			;;
		*) # *)表示默認命令序列
			echo "This is default command"
			;;
	esac # esac 是case模塊的結束標誌,是case反着寫 esac
done

# break  跳出循環
# continue 繼續循環

# shell 函數
function doFunc()
{
	echo "This is my first Func!"
}

doFunc2(){ #參數是$1,$1,...$n ,當天n>10時,需要使用${10}來獲取參數
	echo "The length of doFunc2 params is: "$#
	for param in $@
	do
		echo $param
	done
}
echo "------------before call doFunc------------"
doFunc #直接也函數名
echo "------------after call doFunc------------"
echo "------------before call doFunc2------------"
doFunc2 param1 param2 param3  # 傳參直接跟在後面
echo "------------after call doFunc2------------"

# 輸入輸出重定向
# >file
# <file
# >> file 追加
# n >& m 將輸出文件m和n合併
# n <& m 將輸入文件m和n合併
# <<tag將開始標記tag和結束標記tag之間的內容作爲輸入

# 標準輸入文件:stdin的文件描述符爲0
# 標準輸出文件:stdout的文件描述符爲1
# 標準錯誤文件:stderr的文件描述符爲2

# stderr重定向到文件: command 2 >> file 追加的方式,>是覆蓋
# 將stdout和stderr合併到一個文件輸出:command >> file 2>&1

# Here Document 是Shell中一種特殊的重定向方式,用來將輸入重定向到一個交互式Shell腳本或程序
# command << delimiter
#	document 
# delimiter
# 作用是:將2個delimiter之間的內容作爲輸入傳遞給command。
# delimiter一定要定格寫

wc -l << EOF
	Welcome to 
	W3School !
	www.w3school.cc
EOF
wc -l < $0 >> file 2>&1 # 將標準輸出和錯誤輸出重定向到file文件中
wc -l < $0 >> file2 2>&2
# 如果希望執行某個命令,但又不希望屏幕上顯示輸出結果,可以重定向到/dev/null
# command > /dev/null 
# 寫入到/dev/null的內容都會被丟棄。如果嘗試從/dev/null中讀取內容會什麼也讀不到。將輸出重定向到/dev/null會起到“禁止輸出”的效效果
echo "演示:wc -l < $0 > /dev/null 2>&1 "
wc -l < $0 > /dev/null 2>&1  #禁止輸出



#引用外部腳本.2種方式:
. ./b.sh 
echo "b.sh的變量爲:$b_var"

source ./c.sh 
echo "c.sh的變量爲:$c_var"


#參考地址 http://www.runoob.com/linux/linux-shell.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章