一:shell腳本內(nèi)容解釋器
#!/bin/bash
#!/bin/sh
以上兩種方式都行 ,sh是bash的軟鏈接,后者更加規(guī)范
二:shell腳本的執(zhí)行方式
1. bash/sh script_name #推薦使用
2. ./script_name #此方式需要腳本有執(zhí)行權限,若沒有則無法自動補全
3. source script_name
4. . script_name #此方式中"."和script_name中間必須有空格
以上3、4兩種1方式和1、2兩種方式的區(qū)別是:3、4方式會將shell腳本中的變量自動加到環(huán)境變量中。
三:變量
變量分為:環(huán)境(全局)變量和普通(局部)變量
環(huán)境變量:可以在創(chuàng)建他們的shell和其派生出來的任意子進程shell中使用,環(huán)境變量又分為自定義環(huán)境變量和內(nèi)置環(huán)境變量
普通變量:只能在創(chuàng)建他們的shell函數(shù)或shell腳本中使用
環(huán)境變量的定義方式:
1: export 變量名=value
2: 變量名=value;export 變量名
3: declare -x 變量名=value
注:
以上變量在退出命令行時變量就會丟失,若想永久保存環(huán)境變量則在用戶家目錄下的:
/etc/bashrc(優(yōu)先推薦)
/root/.bashrc (用戶的環(huán)境變量優(yōu)先推薦)
/root/.bash_profile
/etc/profile
配置以上文件即可
變量顯示的方式:
顯示變量的命令:
1:set 輸出所有變量:包括全局變量和局部變量
2:env 只顯示全局變量
3:declare 輸出所有的變量、函數(shù)、整數(shù)和已經(jīng)導出的變量
在使用shell腳本時一般直接使用系統(tǒng)默認的環(huán)境變量,不用自己定義,在使用定時任務時建議在腳本中重新定義
消除普通和環(huán)境變量:
unset 變量名
總結:
1.變量名要大寫
2.變量可以在自身的shell和子shell中使用
3.常用export來定義環(huán)境變量
4.env默認顯示所有環(huán)境變量和其對應的值
5.書寫crond定時任務時,腳本中要用到的環(huán)境變量最好先在所執(zhí)行的shell腳本中重新定義
6.要使環(huán)境變量永久生效,則可以將其放在用戶變量文件或全局變量文件
普通變量的定義方式
1:變量名=value
2:變量名='value'
3:變量名=“value”
注:
僅僅限制當前用戶的腳本中使用,當shell啟動另一個腳本或退出,則本地變量失效
#!/bin/bash
a=192.168.10.1
b='192.16.10.1'
c="192.168.10.1"
echo "a=$a"
echo "b=$b"
echo "c=${c}"
a=192.168.10.1-$a
b='192.16.10.1-$a'
c="192.168.10.1-$a"
echo "a=$a"
echo "b=$b"
echo "c=${c}"
運行結果:
a=192.168.10.1
b=192.16.10.1
c=192.168.10.1
a=192.168.10.1-192.168.10.1
b=192.16.10.1-$a
c=192.168.10.1-192.168.10.1-192.168.10.1
注:
$a作為本地變量在第一行為192.168.10.1
linux,sed、grep中的經(jīng)驗(不含awk):
1、連續(xù)的數(shù)字或字符串內(nèi)容不加引號
2、需要原樣輸出加單引號
3、其他(字符串中有空格或者其他字符)都加雙引號
awk中變量的使用:
不管變量如何定義、賦值,除了加單引號以外,利用awk直接獲取變量的輸出,結果都是一樣的。
因此通常會:先用echo加符號輸出變量,然后通過管道給awk,進而控制輸出結果
[root@mycentos ~]# ETT="hello"
[root@mycentos ~]# echo "$ETT" |awk '{print $0}'
hello
[root@mycentos ~]# echo '$ETT' |awk '{print $0}'
$ETT
[root@mycentos ~]# echo $ETT |awk '{print $0}'
hello
注:
當變量后面連接有其他字符的時候,必須給變量加上大括號{},例如:
dbname=hello
echo ${dbname}_world
鏈接:
http://oldboy.blog.51cto.com/2561410/760192
重要的參數(shù)
$0:腳本名稱(有路徑的話,路徑也顯示常用來提示用戶輸入時語法錯誤)
$n:腳本的第n個參數(shù)
$#:參數(shù)的總個數(shù)
$*:獲取所有腳本所有參數(shù),若加""時,將所有參數(shù)視為單個字符串,相當于"$1,$2,$3"
$@:獲得所有腳本所有參數(shù),若加""時,將所有參數(shù)視為不同的字符串,相當于"$1""$2""$3"
$? :上個命令執(zhí)行成功則返回0,失敗則返回一個非0數(shù)
腳本中:exit 數(shù)值 ==>此數(shù)字會給$?
函數(shù)中:return 數(shù)值 ==>此數(shù)字給$?
注:
1.$* 和$@不加""時完全一樣,加上后不一樣
$* 和$@的聯(lián)系與區(qū)別
[root@mycentos ~]# set -- "i am " boy girl #"--"表示清除后面參數(shù)變量
[root@mycentos ~]# echo $#
3
[root@mycentos ~]# echo $1
i am
[root@mycentos ~]# echo $2
boy
[root@mycentos ~]# echo $3
girl
[root@mycentos ~]# echo $*
i am boy girl
[root@mycentos ~]# for I in $* ;do echo $I;done
i
am
boy
girl
for I in $@;do echo $I;done
i
am
boy
girl
以上不加""的@是一樣的
[root@mycentos ~]# for I in "$*" ;do echo $I;done #<==參數(shù)合二為一作為一個參數(shù)字符串
i am boy girl
[root@mycentos ~]# for I in "$@";do echo $I;done #<===這才是我們想要的,三個獨立的參數(shù)
i am
boy
girl
#此例子表明加上""的*和@是不一樣的
2.傳參數(shù)時,若參數(shù)用""括起來,則相當于一個參數(shù)
參數(shù)多時的技巧
[root@mycentos ~]# echo \${1..15}
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
但是n大于9時,要加大括號。否則會出現(xiàn)金庸新著的問題
例如:${10} ${11} ${12}
四:算數(shù)運算符
(()):整數(shù)運算的常用運算符
let:用于整數(shù)運算,類似于(())
expr:可用于整數(shù)運算,還有其他的額外功能
$[] :整數(shù)運算
bc :適合整數(shù),也適合小數(shù)
awk:適合整數(shù)和小數(shù)
(())運算符
算數(shù)比較:
((i=i+1))
echo $((i=i+1)) #==>得到i的數(shù)值
[root@mycentos ~]# echo $((2+1))
3
[root@mycentos ~]# i=1
[root@mycentos ~]# echo $((i=i+1))
2
[root@mycentos ~]# num=$((a=8-2**3+4%3))
[root@mycentos ~]# echo $num
1
(())還可以用于邏輯比較:1是真,0是假
[root@mycentos ~]# num=$((8>10 && 5== 5))
[root@mycentos ~]# echo $num
0
(())在執(zhí)行命令時不用加$符號,直接使用((6%2))即可,但是如果需要輸出,就要加$,echo $((6%2))
let運算符
let 賦值表達式 == ((賦值表達式))
let i=i+1 等同于((i=i+1)),后者效率更高
[root@mycentos ~]# i=1
[root@mycentos ~]# let i=i+9
[root@mycentos ~]# echo $i
10
expr運算符
用法:
1:運算符號以及計算的數(shù)字左右都應該至少一個空格
2:使用乘號時,必須轉義
一.基礎用法:
[root@mycentos ~]# expr 1 + 1
2
[root@mycentos ~]# I=10
[root@mycentos ~]# expr $I + 2
12
二.檢測變量值或字符串是否是整數(shù):
expr $1 + 1 &> /dev/null
[ $? -eq 0 ]&&echo int ||echo chars
注:
1.此方法是將一個未知量和一個已知整數(shù)相加,若返回值是0,則是整數(shù),否則就不是整數(shù)
2. [ -n "$(echo $1|sed 's#[0-9]##g')" ] #檢測非空(返回值非0)則是
此方式是將原來參數(shù)去處數(shù)字后,看是否是空字符串,若是則原來的參數(shù)是整數(shù),否則就不是。
三.計算字符串長度:
[root@myredhat ~]# HELLO="world"
[root@myredhat ~]# expr length "$HELLO"
5
實戰(zhàn)題目:
請編寫shell腳本,打印下列字符數(shù)不大于4的單詞
I am a good student in linux
#!/bin/bash
for I in i am a good student in linux
do
if [ $(expr length "$I") -le 4 ] #expr length來取得變量的字符長度
then
echo $I
fi
done
$[]運算符
$[]進行整數(shù)的運算時, $[]===$(())
bc(linux下的交互性計算器)的用法
[root@mycentos ~]# echo 3+3 | bc
6
[root@mycentos ~]# echo 3.3 + 5.5 | bc
8.8
[root@mycentos ~]# echo "scale=2;100/3"|bc ##scale表示保留多少位小數(shù)
33.33
實戰(zhàn)題目:
通過一條命令輸出1+2+3+4+5+6+7+8+9+10,并且計算其結果
1. [root@mycentos shell_dir]# seq -s "+" 10|bc #-s 表示以什么作為數(shù)字之間的分隔符
55
2.
[root@mycentos ~]# echo {1..10}
1 2 3 4 5 6 7 8 9 10
[root@mycentos ~]# echo {1..10}| tr ' ' "+"
1+2+3+4+5+6+7+8+9+10
[root@mycentos ~]# echo {1..10}| tr ' ' "+"|bc
55
awk運算符(小數(shù)時推薦)
[root@mycentos ~]# echo "3.7 2.11"|awk '{print $1-$2}'
1.59
[root@mycentos ~]# echo "200 890"|awk '{print ($1-$2/$2)}'
199
[root@mycentos ~]# echo "200 890"|awk '{print ($1-$2)/$2}'
-0.775281
實戰(zhàn)題目:用shell編寫一個2位數(shù)的四則運算
1 #!/bin/bash
2
3 print_usage(){ ##出現(xiàn)錯誤時就輸出提示
4 printf "usage:$0 num1 {+-*/} num2\n"
5 exit 1
6 }
7 num1=$1
8 op=$2
9 num2=$3
10
11 if [ $# -ne 3 ]#依次必須輸入三個
12 then
13 print_usage
14 fi
15
16 if [ -n "$(echo $num1|sed 's#[0-9]##g')" ]##檢驗是否是整數(shù):將數(shù)字全部去除,檢測剩下的是否是空字符串
17 then
18 print_usage
19 fi
20
21 if [ "$op" != "+" ]&&[ "$op" != "-" ]&&[ "$op" != "*" ]&&[ "$op" != "/" ]##符號不對的話輸出提示
22 then
23 print_usage
24 fi
25
26 if [ -n "$(echo $num2|sed 's#[0-9]##g')" ]
27 then
28 print_usage
29 fi
30
31 echo ${num1}${op}${num2}=$((${num1}${op}${num2}))