[linux學習筆記]第3天:變數分類,重新導向,管道命令,程式執行流,文本處理類命令, Regex,短路操作符

來源:互聯網
上載者:User

變數的分類
 本地變數: 只對本地有效,對子shell無效    // /bin/bash 開啟子shell
 環境變數: 對本地和子shell都有效
   export A=3
   或
   A
   export A
         export  //查看當前系統內容變數

## exprot部分顯示結果    declare -x DISPLAYE=“”         //指定輸出顯示器   declare -x HISTSIZE="1000"     //history能儲存的命令條數   declare -x HOME="/root"         //目前使用者家目錄   declare -x HOSTNAME="server45.example.com"   //當前主機名稱       declare -x LANG="zh_CN.gbk"             //所使用的語言   declare -x LOGNAME="root"          //登入使用者的名稱   declare -x OLDPWD="/tmp"          //上一個路徑   declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"   declare -x PWD="/tmp/scripts"     //當前路徑

   printenv  //類似export
   env       //顯示當前環境變數
   
 特殊變數:$?                                  
   ehco $?     //上一個命令是否執行成功  0代表成功 1-255失敗

[root@server45 ~]# llsss-bash: llsss: command not found[root@server45 ~]# echo $?127

  位置參數變數: 需要使用者通過命令引用,很有用的變數
  $1,$2,$3   超過10時建議加{}  ${11} 
   算數運算:
  $[]    //echo “$[$A+$B]”
  $(( ))  //echo "(($A+$B))"

#!/bin/bash#echo "$1+$2 is $[$1+$2]"echo "$1-$2 is $[$1-$2]"echo "$1*$2 is $[$1*$2]"echo "$1/$2 is $[$1/$2]"

寫一個指令碼,完成以下功能:
1、傳遞兩個整數給指令碼,讓指令碼分別計算並顯示這兩個整數的和、差、積、商。

 \         //避免展開變數 echo "Your Salary : \$1"           //該命令並不會顯示$1的值,而是顯示$1

[root@server45 ~]#  echo "Your Salary : \$1"   Your Salary : $1

BASH的命令別名
  alias
 

例如將cls設定為lear方便使用
   alias cls=clear
   unlias cls
   alias cdnet='cd /etc/sysconfig/network' //有空格用''    
 全域變數:/etc/profile, /etc/profild.d/*, /etc/bashrc  對所有使用者都作用

       /etc/bashrc     //可設定alias對所有使用者有效
       /etc/profild.d/*   //將profile分成片便於管理
       /etc/profild        //設定全域有效變數,永久有效
         export DFSF=dfsf  //需登出才生效
         source /etc/profile //重讀profile,可立刻生效,不建議
 局部變數: ~/.bash_profile, ~/.bashrc ~/.bash_logout  只對目前使用者有效
 profile類:
  1.設定環境變數
  2.運行使用者登入時要執行的一些命令
 bashrc類    
  1.設定別名
  2.設定本地變數
------------------------------------------------------------------------------------------------- 
 shell分類:
  1.互動式登入式shell
   使用者登入進去輸入命令
   過程: 
    /etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> /etc/bashrc
  2.非登入式shell
   指令碼執行過程中,系統自動運行,不需要使用者登入輸入命令
   過程:
    ~/.bashrc --> /etc/bashrc --> /etc/profile.d/×

——————————————————————————————————————————————————

輸入/輸出重新導向 ,管道   輸出資料流
 I/O重新導向分為:

  標準輸入 :/dev/stdin,  0, KEYBOARD,<    //平常可以不輸入
  標準輸出 :/dev/stdout, 1, MONITOR,  >       //命令正常執行      cat > /tmp/ls1.out
  錯誤輸出 :/dev/stderr, 2, MONITOR, 2>      //命令錯誤執行      cat 2> /tmp/ls2.out
                                                                                //lessss &> /tmp/ls3.out      //&> 合并>和2> 

例如

ls /var >> /tmp/var.out 2>> /tmp/var.err              //正確的資訊存在var.out,錯誤的在var.err

其他的重新導向
   >     //覆蓋輸出重新導向  
    >>    //追加輸出重新導向            
   set -C       //開啟避面覆蓋重新導向
   set +C       //關閉
   >|           //強制覆蓋

自訂輸出重新導向
exec 3> /tmp/myout.out //實現多次重新導向到一個檔案,避免多次開啟關閉一個檔案,提升指令碼執行效率
>> //追加
< //讀入
ls /var >&3
exec 3>&- //關閉檔案

寫一個指令碼:
1、設定變數FILE的值為/etc/passwd
2、使用迴圈讀取檔案/etc/passwd的第2,4,6,10,13,15行,並顯示其內容;(提示:LINE=`head -2 /etc/passwd | tail -1`可以取得第2行)
3、把這些行儲存至/tmp/mypasswd檔案中

#!/bin/bash#FILE=/etc/passwdexec 3>> /tmp/mypasswd                    //開啟for N in 2 4 6 10 13 15 ; do  LINE=`head -$N $FILE | tail -1`  echo $LINE  echo $LINE >&1doneexec 3>&-                                 //關閉   unset FILE LINE

————————————————————————————————————————————————————————————————————————

管道 | : 把第一個命令的輸出送到第二個命令處理
  echo "123456" | passwd --stdin rehat       //這個命令將123456交給passwd來處理,--stdin參數會使123456立刻生效成為使用者redhat的密碼
  ls /etc | tee /tmp/ls.out | less   //tee可以把輸出資料流儲存到指定檔案 並交給下一個命令處理
  多個命令的輸出都需要儲存至同一個檔案
  command >> a.out
  command >> a.out  

    /dev/null    null 指空檔案,任何被放到Null的資料都被刪除,在linux裡是一個常用的命令,可以輕鬆去除輸出結果,不過要小心使用

    比如: ls /var/ttt &> /dev/null    //無論結果如何,都輸出到null裡,不會顯示結果
——————————————————————————————————————————————————

 程式執行流 

分類:
 順序執行
 選擇分支 
 迴圈執行                                  //這一次只學習for迴圈
  for I in LIST ; do                       //LIST是這個迴圈的條件,也叫做列表,可以是字元,數字,運算式
   statement1
   statement2
  done

列表分類:
  簡單列表: 1 2 3 4
  複雜列表: This is TOM`s cat
  命令    : `ls /var`
  萬用字元  : for I in /var/*

  
  例如:
  for LINE in `cat /etc/passwd`: dao
  而外說明
  IFS=$'\n'      //for 迴圈只是別分行符號
   
   寫一個指令碼:添加10個使用者user1-10

#!/bin/bash#   for I in 1 2 3 4 5 6 7 8 9 10 ;do    //或者for I in `seq 1 10`    usradd user$I    echo user$I |  passwd --stdin user$I   done## seq 1 10    //代表 1~10 ## 也可以使用{1..10}

文本處理類命令cut  -d: -d""    

 //指定分隔字元:或"" -f     //指定第幾段 

[root@server45 scripts]# tail -1 /etc/passwd | cut -d: -f6     /home/dean 

grep與Regex 
 
grep:  全面搜尋Regex並列印出來
 grep,egrep,fgrep

  grep [options] "PATTERN“ file...                     //grep的用法
  -i   //不區分大小寫
  -v   //顯示沒有匹配到模式的行
   -n   //顯示匹配的行在原文中所處的行號
   -An  //顯示後n行   
   -Bn  //顯示前n行
   -Cn  //上下文,顯示上線n行
   --color   //把匹配的高亮顯示
 模式
 
 Regex,元字元 re 
 ^        //錨定行首   ^love  love必須在行首
 $        //錨定行尾
 .        //用於匹配任意單個字元
 *        //root*   *前的t可以出現0次或任意次
  ?
  []       //匹配一組字元中任意一個
  \
  \<       //詞首定位器
  \>       //詞尾定位器
  x\(m)\   //x精確出現m次
  x\(m,)\  //x至少出現m次
  x\(m,n)  //x至少出現m次,最多m次
  \(...)\  //任意長度的任一字元
 
  grep -E = egrep
  +  相當於\{1,\}
  ?  相當於\{0,1}\
  |  或 
    ’love|hate‘ e或h誰出現都行

grep練習

1、顯示/proc/meminfo檔案中以不區分大小的s開頭的行;
   grep -i s /proc/meninfo               //使用-i 不區分大小寫2、顯示/etc/passwd中以nologin結尾的行;   grep nologin$ /etc/passwd             //$符號錨定結尾3、顯示/etc/inittab中以#開頭,且後面跟一個或多個空白字元,而後又跟了任一字元的行;   grep --color ^#[[:sapce:]]\{1,}\ /etc/inittab         //^符號錨定開頭,[[:space:]].*用來匹配多個連續空白字元4、顯示/etc/inittab中包含了:一個數字:(即兩個冒號中間一個數字)的行;    grep :[0-9]: /etc/inittab                   5、顯示/boot/grub/grub.conf檔案中以一個或多個空白字元開頭的行;    grep ^[[:space:]]\{1,\}.*" /boot/grub/grub.conf                grep  -E --color "^[[:space:]]{1,}.*" /boot/grub/grub.conf     //egrep解法,注意與grep區別{} 6、顯示/etc/inittab檔案中以一個數字開頭並以一個與開頭數字相同的數字結尾的行;   grep "^\([0-9]\).*\1" /etc/inittab             //使用\(\)  \1   來做前後匹配   注意使用“” .*用以匹配任意個連續字元               7、ifconfig命令可以顯示當前主機的IP地址相關的資訊等,如果使用grep等文本處理命令取出原生各IP地址,要求不包括127.0.0.1;   ifcofig | grep "inet addr" | grep -v '127.0.0.1' | cut -d: -f2 | cut -d "" f1         //grep與cut的混合使用8、顯示/etc/sysconfig/network-scripts/ifcfg-eth0檔案中的包含了類似IP地址點分十進位數字格式的行;    grep -E "([0-9]{1,3}\.){3}\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-eth0     
   grep "[0-9]\{1,3\}\."\{3\}\.[0-9]\{1,3\} /etc/sysconfig/network-scripts/ifcfg-eth0    //注意egrep和grep的區別

————————————————————————————————————————————————————————————————————————
短路操作符 
&&            //與運算,當你需要判斷使用兩條命令是,使用&&: 如果第一個運行結果錯誤,那麼繼續運行第二個命令,結果為第二個命令,

                                                                                             如果第一個命令正確,那麼將不會在運行第二個命令
 1 && ? = ?
 0 && ? = 0
||               //或運算,使用|| : 如果第一個命令結果錯誤,那麼結果直接為第一個命令,

                                              如果第一個命令結果正確,那麼結果為第二個命令
 1 || ? = 1
 0 || ? = ?
 

## 結合/dev/null的使用,將會發揮很重要的效果

例如   cat /tmp/aaa >> /tmp bbb || cat /tmp/aaa &>/dev/null      

##這個命令,如果aaa不存在的話,將會直接將結果輸出到/dev/null下,而不會佔用系統資源輸出錯誤資訊

 

寫一個指令碼:
1、添加10個使用者user1到user10,但要求只有使用者不存在的情況下才能添加;

#!/bin/bash#for I in {1..10} ; do  grep user$I /etc/passwd &> /dev/null || useradd user$I         //如果使用者存在,直接輸出到/dev/null,負責增加使用者user$Idoneunset I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

程式設計語言:
指令碼語言:bash,perl(語言學家),python(靈活,簡潔),ruby,php
以來源程式的方式存在,執行前不需要編譯,而是靠一個解譯器執行
維護簡便
執行效率差

編譯型語言:
編輯-->編譯-->連結-->運行

指令碼:命令的堆砌
#!/bin/bash //第一行標準 shebang
#

nano myscript.sh
chmod +x myscript.sh
./myscript.sh //執行指令碼

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.