shell基礎(一)變量及運算

一: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}))
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,707評論 0 5
  • 什么是運維 術語名詞 IDC--(Internet Data Center)互聯(lián)網(wǎng)數(shù)據(jù)中心,主要服務包括整機租用、...
    lyh165閱讀 2,875評論 0 19
  • 菜鳥教程shell在線編輯器大目錄整理: 1.第一個 Shell 腳本嘗試 2.Shell 變量 3.Shell ...
    中酷男閱讀 6,035評論 0 12
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,542評論 0 13
  • 在媒體行業(yè),在基層電視臺(新聞中心),寫東西機會多,要不要嘗試寫寫小說?先模仿?題材呢?基層公務員生活日常怎么樣?
    卜卜31閱讀 184評論 0 0

友情鏈接更多精彩內(nèi)容