+, -, *(乘), /(除), **(乘方), %(取模)
-
let var=算術運算子運算式
高級let用法:let i+=2
+=,-=,*=,/=,%=,**=
自增:let var++
-
var=$[算術運算子運算式]
-
var=$((算術運算子運算式))
-
var=$(expr $ARG1 OP $APG2)
</font color=red>注意:乘法符號在某些場景中需要使用轉義符
練習1:寫一個腳本檔案,完成如下功能:添加3個用戶,求這3個用戶的UID之和,
#!/bin/bash
id testUser1 > /dev/null || useradd testUser1
id testUser2 > /dev/null || useradd testUser2
id testUser3 > /dev/null || useradd testUser3
uid1=`grep "testUser1" /etc/passwd | cut -d: -f3`
uid2=`grep "testUser2" /etc/passwd | cut -d: -f3`
uid3=$(grep "testUser3" /etc/passwd | cut -d: -f3)
#方法1
#let num=$uid1+$uid2+$uid3
#方法2
#num=$[$uid1+$uid2+$uid3]
#方法3
num=$(($uid1+$uid2+$uid3))
#方法4
#num=$(expr $uid1 + $uid2 + $uid3)
echo $num
練習2:寫一個腳本檔案,完成如下功能:求/etc/passwd檔案中第10行和第20行的用戶的UID之和
#!/bin/bash
#先用head取前10行,再用tail取最好一行,然后再用cut切
la=`head -10 /etc/passwd | tail -1 | cut -d: -f3`
lb=`head -20 /etc/passwd | tail -1 | cut -d: -f3`
echo $la
echo $lb
let lc=$la+$lb
echo $lc
練習3:寫一個腳本檔案,完成如下功能:求/etc/passwd檔案中,uid最大的2個uid之和
#!/bin/bash
#先用冒號把檔案分成多列,用第三列從大到小排序后,分別取第一行和第二行,最后在用cut切開
la=`sort -t: -k3 -nr /etc/passwd | head -1 | cut -d: -f3`
lb=`sort -t: -k3 -nr /etc/passwd | head -2 | tail -1 | cut -d: -f3`
echo $la
echo $lb
let lc=$la+lb
echo $lc
練習4:寫一個腳本檔案,完成如下功能:通知2個檔案里的空白行數之和
#!/bin/bash
#用grep找出空白行(使用正則運算式),然后再用wc數一數有多少行
la=`grep -e "^[[:space:]]*$" /etc/rc.d/init.d/functions | wc -l`
lb=`grep -e "^[[:space:]]*$" /etc/inittab | wc -l`
echo $la
echo $lb
let lc=$la+$lb
echo $lc
條件陳述句
測驗運算式:
- test expression
- [ expression ]
- [[ expression ]]
注意:中括號中間的空格,沒有空格就是語法錯誤
bash的條件測驗型別
-
數值比較大小
- -eq:等于 [ $num1 -eq $num2 ]
- -ne:不等于[ $num1 -ne $num2 ]
- -gt:大于[ $num1 -gt $num2 ]
- -ge:大于等于[ $num1 -ge $num2 ]
- -lt:小于[ $num1 -lt $num2 ]
- -le:小于等于[ $num1 -le $num2 ]
例子:[ 2 -ne 3 ]和test 2 -ne 3效果一樣
#!/bin/bash if [ 2 -ne 3 ]; then echo 11 else echo 22 fi if test 2 -ne 3; then echo 111 else echo 222 fi -
字串比較
== :等于
> :大于
< :小于
!= :不等于
=~ :左側字串是否被右側的正則運算式所匹配,
-z "STRING" :指定字串為空則為真
-n "STRING":指定字串不為空則為真
做字串比較的變數,最好加上“”,不加的話,如果做比較的某個變數沒有被定義的話,執行就會出錯,
下面的例子,tom是不存在的變數,不加括號就出錯誤了,加了就沒有錯誤,
$ [ tom = $tom ] -bash: [: tom: unary operator expected $ [ tom = "$tom" ] $ echo $? 1字串比較,最好要用[[]],
下面的例子,說明了用[]無法比較
$ [ a > b ] $ echo $? 0 $ [ a < b ] $ echo $? 0 $ [ "a" < "b" ] $ echo $? 0 $ [ "a" > "b" ] $ echo $? 0下面的例子,說明用[[ ]]達到了預期,
$ [[ a < b ]] $ echo $? 0 $ [[ a > b ]] $ echo $? 1 $ [[ "a" > "b" ]] $ echo $? 1 $ [[ "a" < "b" ]] $ echo $? 0字串空的判斷:
$ [[ -z "$tom" ]] $ echo $? 1 [ys@localhost ~]$ [[ -n "$tom" ]] [ys@localhost ~]$ echo $?正則運算式的匹配:
$ tom=ooo [ys@localhost ~]$ [[ $tom =~ o.* ]] [ys@localhost ~]$ echo $? 0 [ys@localhost ~]$ tom=jerry [ys@localhost ~]$ [[ $tom =~ o.* ]] [ys@localhost ~]$ echo $? 1 -
檔案測驗
-
檔案存在性檢查:-a FILE,或者,-e FILE,存在回傳0.
例子:
[ -a /etc/passwd ],[ -e /etc/passwd ] -
檔案存在性和型別檢查
-b FILE:檔案存在,且型別是塊設備,則回傳0.
-c FILE:檔案存在,且型別是字符設備,則回傳0.
-d FILE:檔案存在,且型別是目錄,則回傳0.
-f FILE:檔案存在,且型別是普通檔案,則回傳0.
-h或 -L FILE:檔案存在,且型別是符號鏈接,則回傳0.
-p FILE:檔案存在,且型別是命名管道,則回傳0.
-S FILE:檔案存在,且型別是本地套接字,則回傳0.
$ [ -b /dev/sda ] [ys@localhost scripts]$ echo $? 0 [ys@localhost scripts]$ [ -b /dev/sdad ] [ys@localhost scripts]$ echo $? 1 [ys@localhost scripts]$ [ -b 2.sh ] [ys@localhost scripts]$ echo $? 1 -
檔案權限檢查
-r FILE:檔案存在,且當前用戶(運行此shell行程的用戶)可讀,則回傳0.
-w FILE:檔案存在,且當前用戶(運行此shell行程的用戶)可寫,則回傳0.
-x FILE:檔案存在,且當前用戶(運行此shell行程的用戶)可執行,則回傳0.
-
特殊權限檢查
-u FILE:檔案存在,且擁有suid權限,則回傳0.
-g FILE:檔案存在,且擁有sgid權限,則回傳0.
-k FILE:檔案存在,且擁有sticky權限,則回傳0.
-
檔案是否有內容
-s FILE:檔案存在,且有內容,則回傳0
-
時間戳
-N FILE:檔案自從上一次讀取操作后,是否被修改過,
-
從屬關系
-O FILE:當前用戶是否檔案屬主
-G FILE:當前用戶是否在檔案屬組里,
-
雙目
FILE1 -ef FILE2:如果FILE1和FILE2是指向同一個檔案系統的相同inode的硬鏈接,則回傳0.
FILE1 -nt FILE2:如果FILE1的修改時間戳新于FILE,則回傳0
FILE 1 -ot FILE2:如果FILE1的修改時間戳舊于FILE,則回傳0
-
組合測驗條件
第一種方式:
- [ expression1 ] && [ expression2 ]
- [ expression1 ] || [ expression2 ]
- ! COMMOND
第二種方式:
- 與運算:[ expression1 -a expression2 ]
- 或運算:[ expression1 -o expression2 ]
練習:判斷主機名稱是否為空,或者是否是localhost.localdomain
#!/bin/bash
hostname=`hostname`
if [ -z "$hostname" -o "$hostname" == "localhost.localdomain" ]; then
hostname=11111
else
echo "ng"
fi
echo $hostname
向腳本檔案傳遞執行時候的引數
使用位置引數變數:$1,$2,...${10},${11}.
10之后的引數必須加上{},
$0:是腳本本身的路徑加腳本檔案的名字,
$#:是引數的個數
$*:拿到所有引數,但把所有引數匯總成了一個串
$@:拿到所有引數,但沒有把引數匯總成一個串,
當執行下面命令后,$1的值就是111;$2的值就是222;$3的值就是333;
$ ./script.sh 111 222 333
shift用法:shift n:踢掉前n個位置引數變數
下面的內容保存在shift.sh中
#!/bin/bash
echo $1 $2
shift 1
echo $1
shift 1
echo $1
執行shift.sh的結果:
# bash shift.sh 111 222 333
111 222
222
333
練習:傳遞2個文本檔案的路徑給腳本,計算出空白行數之和,
#!/bin/bash
la=`grep -e "^[[:space:]]*$" $1 | wc -l`
lb=`grep -e "^[[:space:]]*$" $2 | wc -l`
echo $la
echo $lb
let lc=$la+$lb
echo $lc
執行結果:
# bash sumforarg.sh /etc/rc.d/init.d/functions /etc/inittab
91
0
91
if語法
if con1 ; then
elif con2 ; then
else
fi
練習:查看給定用戶是否存在,不存在則創建此用戶,
#!/bin/bash
if ! grep "^$1\>" /etc/passwd &> /dev/null ; then
useradd $1
# 設定用戶$1的密碼是111
echo "111" | passwd --stdin $1 &> /dev/null
echo "add user $1 donw!"
fi
練習:比較2個數字的大小
#!/bin/bash
#宣告一個變數,是整數,
declare -i max
#引數個數小于2
if [ $# -lt 2 ]; then
echo "at least one argu"
exit 1
fi
#引數1大于引數2
if [ $1 -ge $2 ]; then
max=$1
else
max=$2
fi
echo "max number is $max"
練習:判斷給定用戶名的id號是奇數還是偶數
#!/bin/bash
if [ $# -lt 1 ]; then
echo "at least one argu"
exit 1
fi
#取得用戶的id
uid=$(grep "^$1\>" /etc/passwd | cut -d: -f3)
echo $uid
#判斷奇偶數
if [ $[$uid % 2] -eq 0 ]; then
echo "oushu"
else
echo "jishu"
fi
運行結果:
# bash jigou.sh ys
1000
oushu
# bash jigou.sh fedora
1005
jishu
練習:給2個文本檔案路徑,如果檔案不存在,則結束腳本;都存在則回傳每個檔案的行數,并找出行數多的檔案
#!/bin/bash
if [ $# -lt 2 ]; then
echo "at least two argu"
exit 1
fi
if ! [ -e $1 -a -e $2 ]; then
exit 1
else
la=`wc -l < $1`
lb=`wc -l < $2`
echo "$1 行數:$la;$2 行數:$lb"
if [ $la -ge $lb ]; then
echo "$1 行數多"
else
echo "$2 行數多"
fi
fi
運行結果:
# bash sum1.sh /etc/passwd /etc/fstab
/etc/passwd 行數:56;/etc/fstab 行數:13
/etc/passwd 行數多
case語法
case $var in
pat1)
;;
pat2)
;;
pat3)
;;
*)
;;
esac
pat支持globbing風格:
- *:匹配任意長度的任意字符
- ?:匹配任意單個字符
- []:匹配指定范圍內的任意單個字符
- [^]:匹配指定范圍外的任意單個字符
- {}:表示符合括號內包含的多個檔案
- aaa|bbb:aaa或bbb
執行完腳本檔案后,回傳值是啥?
默認是腳本檔案里最后一條命令的回傳值,
可以自定義回傳值:使用exit n命令,n為數字,
當shell行程遇到exit命令時,行程會立即終止,因此exit后面的命令就不執行了,
c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/145040.html
標籤:Linux
上一篇:Linux 學習筆記 1 使用最小的系統,從磁區安裝系統開始
下一篇:LAMP環境搭建和配置(2)
