Linux shell 基础语法
生活随笔
收集整理的這篇文章主要介紹了
Linux shell 基础语法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
常用變量的定義
//定義變量、獲取變量值(數值型) $ a=1 $ echo ${a} 1 //定義變量、獲取變量值(字符串) $ a="hello world" $ echo ${a} hello world //$?代表上一條命令返回狀態:0代表true,非0代表false $ echo $? 0 //String變量中引用其它變量,本變量要用雙引號,非單引號 $ m="wanglihong" $ n="what is your name? ${m} " $ echo ${n} what is your name? wanglihong //數組定義用小括號表示 $ a=("aaaaa" "bbbbb" "cccc") $ a=(1 2 3 4 5) //遍歷數組用法 $ echo ${a[*]} 1 2 3 4 5 //獲取數組長度用法 $ echo ${#a[*]} 5 //反引號用于將linux命令返回值賦給變量接收 //字符串變量 $ a=`ls` $ echo ${a} Applications Library System Users Volumes bin cores dev etc home opt private sbin tmp usr var //數組變量 $ a=(`ls`) $ echo ${a} Applications $ echo ${a[*]} Applications Library System Users Volumes bin cores dev etc home opt private sbin tmp usr var //先執行ls命令再執行echo命令 $ echo my directiry is `ls` //雙括號是對變量進行操作,(())是整數擴展,把里面的變量當成整數處理 $ a=1;b=2 $ echo $((a+b)) 3 //$(())變量表達式只能計算除數和被除數均為整數且余數為整數的除法; //涉及小數的除法用下面的awk方式 $ awk 'BEGIN{print 2/3}' 0.666667 $ awk 'BEGIN{print 3/4}' 0.75 $ awk "BEGIN{print ${a}/${b}}" //字符串截取(從去掉前五個開始截取,往后取4個) $ a="This is a beautiful girl" $ echo ${a:5} is a beautiful girl $ echo ${a:5:4} is a //獲取字符串長度(變量前加#號) $ echo ${#a} //獲取數組長度(必須加[*]) $ echo ${#a[*]} //從頭匹配第一個指定字符并截取打印后面字符串 $ a="hello from testerhome" $ echo "${a#*o}"from testerhome $ echo "${a#*from}"testerhome //從頭開始匹配直到匹配到最后一個指定字符并截取打印后面字符串 $ echo "${a##*o}" me //從尾部開始匹配直到匹配到第一個指定的字符并截取打印前面的字符串 $ echo "${a%o*}" hello from testerh //從尾部開始匹配直到匹配到最后一個指定字符并截取打印前面的字符串 $ echo "${a%%o*}" hell //關系運算語法(注意格式:[]中空格隔開) $ [ 3 -eq 3 ];echo $? 0 $ [ ! 3 -eq 3 ];echo $? 1 $ [ 4 -gt 3 ];echo $? 0 $ [ 4 -ge 3 ];echo $? 0 $ [ 4 -lt 3 ];echo $? 1 $ [ 4 -le 3 ];echo $? 1 $ [ 4 -le 3 -o 5 -ge 1 ];echo $? 0 $ [ 4 -le 3 -a 5 -ge 1 ];echo $? 1 //字符串替換(from替換成to) $ echo ${a} hello from testerhome $ echo ${a/from/to} hello to testerhome //特殊格式(制表符和換行符)加-e $ echo -e "aaaaaaa\nbbbbbbbbb" aaaaaaa bbbbbbbbb $ echo -e "aaaaaaaaa\tbbbbbb" aaaaaaaaa bbbbbb //判斷文件是否存在 //-e:文件是否存在;-f:文件是否為普通文件;-d:文件是否是文件夾 $ [ -e jmeter.log ];echo $? 0 $ [ -f jmeter.log ];echo $? 0 $ [ -d jmeter.log ];echo $? 1流程控制語句
#if語句 finup$ if [ 3 -gt 2 ];then echo success;else echo failure;fi finup$ if((3>2));then echo success;else echo failure;fi finup$ if [ ${a} -gt ${b} ];then echo successful;else echo failure;fi finup$ if [ -e jmeter.log ];then echo "文件存在";else echo "文件不存在";fi #for循環 $ for i in ${arr[*]};do echo ${i};done $ for((i=0;i<${#arr[*]};i++));do echo ${i};done $ for i in `ls`;do echo ${i};done //下面兩種方式等價 $ i=0;while((i<10));do echo ${i};((i++));done $ i=0;while [ ${i} -lt 10 ] ;do echo ${i};((i++));done # while循環 finup$ i=0;while [ ${i} -le 2 ];do echo ${i};((i=i+1));done 0 1 2 //while read讀取文件,“<”是輸出重定向;">"是輸入重定向,如echo "hello world" > test.txt finup$ while read i;do echo ${i};done <jmeter.log //read命令讀取鍵盤輸入數據 finup$ read v;echo ${v} finup$ read -p "enter:" v;echo ${v} enter:44444444 44444444 # for循環與if綜合: for i in *;do echo ${i};if [ -f ${i} ];then break;fi;done for x in *;do echo ${x};if [ -f ${x} ];then echo ${x} is a file;else continue;fi;doneshell運行環境概念
//{}代表在當前shell中運行 { m=8;echo ${m}; };echo $m //()代表在子shell中運行 $ (m=1;echo ${m}) //echo $$代表返回當前shell的pid,bash命令進入子shell $ echo $$ 10972 $ bash The default interactive shell is now zsh. To update your account to use zsh, please run `chsh -s /bin/zsh`. For more details, please visit https://support.apple.com/kb/HT208050. bash-3.2$ echo $$ 13182 //前者是覆蓋輸入;后者是追加輸入 echo "hello from world!" > test.txt echo "hello to world!" >>test.txt //四個常見的預定義變量:linux系統提前定義好的;PATH變量中":"冒號與window環境變量中的分號";"作用相同,分隔變量 $ echo $PATH 輸出: /Users/configSoftWare/apache-maven-3.6.2/bin:/usr/local/mysql/bin $ echo $USER 輸出: finup $ echo $PWD 輸出: /var $ echo $HOME 輸出: /Users/finup //自定義創建可執行文件.sh,通過bash命令執行文件中的指令并輸出 $ cat wulala echo "hello from testerhome!" ls -lh $ bash wulala hello from testerhome! total 2 drwxr-xr-x 3 finup staff 96B 8 25 16:01 AndroidStudioProjects -rw-r--r-- 1 finup staff 29K 7 17 2020 AppiumProject.zip drwx------@ 3 finup staff 96B 11 9 17:57 Applications drwx------@ 29 finup staff 928B 1 26 10:22 Desktop /** grep從指定文件中匹配指定內容并打印; "-i":忽略大小寫; "-o":精確匹配內容,不帶o默認顯示所在行內容; "-v":不顯示指定對象所在行 "-C2":顯示指定匹配對象上下文所在行內容,默認顯示上下各兩行,可以為C3、C4等 "-A2":顯示指定匹配對象后面兩行內容(After) "-B2":顯示指定匹配對象前面兩行內容(Before) */ $ grep -i "hello" wulala.txt hello to testerhome HELLO TO TESTERHOME $ grep -io "hello" wulala.txt hello HELLO ps -ef | grep bash | grep -v grep cat demo.log | grep -C2 503 //其中"|"是管道符 $ cat wulala.txt | grep -i "hello" hello to testerhome HELLO TO TESTERHOME //"."代表匹配任意一個字符;".*"匹配一個或多個字符 $ cat wulala.txt | grep -o "c." $ cat wulala.txt | grep -o "c.*" //curl高級用法,grep匹配正則表達式,*代表匹配0次或多次 $ while read x;do curl -s http://www.baidu.com/s?wd=${x};done<demo.txt | grep -o "結果約[0-9,]*" //awk:數據切片,通過-F指定分割符對內容進行分割輸出 $ echo "123|456|789"|awk -F '|' '{print $3}' $ echo "aaaaa_bbbbbb_ccccc_dddd" | awk -F '_' '{print $4}' $ cat passwd | awk -F ':' '{print $1}' $ cat passwd | awk -F ':' '{print $1,$6}' //打印出的第1列和第6列以空格隔開$ cat passwd | awk -F ':' '{print $1"\t"$6}' //打印出的第1列和第6列以制表符號隔開 $ curl -s http://www.baidu.com/s?wd=mp3 | grep -o "結果約[0-9,]*" | awk -F '個|約' '{print $2}'//-s靜默模式;-A用戶代理;-b代表cookie信息curl -s -b "device_id=web_HyXwYokKD; channel=1141" -A "Mozilla/5.0...Safari/537.36" https://danju.com/dj //awk輸出結果去除空行使用{if(length !=0) print $0}參數$ curl -s https://www.jianshu.com/u/b1486d9b1588 | awk -F '<a class="title" target="_blank" href' '{print $2}' | awk -F '">' '{print $2}' | awk -F '</a>' '{print $1}' | awk '{if(length !=0) print $0}' //sed:文本替換,+號替換成_號,以s開頭,以g結尾代表全部替換,不寫g只替換第1個$ echo "aaa+bbb+ccc" | sed 's/+/_/g' 輸出:aaa_bbb_ccc$ sed 's/任意花api接口/蒙牛智網接口清單/g' jmeter.log //只替換暫存區,不會更新原始文件$ sed -i.bak 's/任意花api接口/蒙牛智網接口清單/g' jmeter.log //"-i"會覆蓋源文件,"-i.bak"會備份原文件后綴以bak結尾,可自定義 # vim創建文件demo.bash,并填寫函數如下;保存后,chmod +x demo.bash,在命令行中執行demo.bash即可執行文件中的函數goFunction(){echo "this is a testing case,please skip it"read -p "Enter var_a:" var_aread -p "Enter var_b:" var_bif [ ${var_a} -eq ${var_b} ]thenecho "var_a等于var_b"elif [ ${var_a} -gt ${var_b} ]thenecho "var_a大于var_b"elseecho "var_a小于var_b"fi } goFunction # awk、grep、curl、for及``的綜合應用:統計網站文章列表中每篇文章里面的點贊數 a=`curl -s https://testerhome.com/topics | grep -o 'href="/topics/[0-9]*"' | awk -F '"|/' '{print $4}'`; for id in ${a};do url='https://testerhome.com/topics/'${id}; inside=`curl -s ${url} | grep -m 1 -o '<span>[1-9][0-9]* 個贊</span>' | awk -F '<span>|</span>' '{print $2}'`; echo 該篇文章的id為:${id},點贊數量為:${inside};done /** BEGIN代碼塊:(BEGIN后面第一個花括號) 在讀取文件之前執行,且執行一次 在BEGIN代碼塊中,無法使用$0或其它一些特殊變量 main代碼塊:(BEGIN后面第二個直到END之前的花括號) 讀取文件時循環執行,(默認情況)每讀取一行,就執行一次main代碼塊 main代碼塊可有多個 END代碼塊: 在讀取文件完成之后執行,且執行一次 有END代碼塊,必有要讀取的數據(可以是標準輸入) END代碼塊中可以使用$0等一些特殊變量,只不過這些特殊變量保存的是最后一輪awk循環的數據 */ $ echo -e "1|2|3\n4|5|6\n7|8|9" | awk -F '|' 'BEGIN{a=0}{a=a+$2}END{print a}' //獲取公網IP地址 curl icanhazip.com /** 執行下面命令并輸出: $0變量讀取的是demo.sh本身, $1讀取的是demo.sh之后的第一個參數; $2讀取的是demo.sh之后第二個參數; $#代表的是demo.sh之外的參數個數; $*代表的是傳入的參數名稱 第10個及以上${10}括起來,否則讀取不到 */ demo.sh a b c d e 獲取腳本參數:demo.sh 獲取第一個參數:a 獲取第二個參數:b 獲取參數個數:5 獲取參數:a b c d e 獲取參數:a b c d e//demo.sh文件中定義下面參數 echo "獲取腳本參數:$0" echo "獲取第一個參數:$1" echo "獲取第二個參數:$2" echo "獲取參數個數:$#" echo "獲取參數:$*" echo "獲取參數:$@"//demo.sh文件中腳本awk引用變量要用\"${var}\"表示read -p "please enter number m:" mread -p "please enter number n:" necho m+n=$((m+n))echo m-n=$((m-n)) echo m*n=$((m*n)) echo `awk "BEGIN{print \"$m\"/\"$n\"}"`總結
以上是生活随笔為你收集整理的Linux shell 基础语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jenkins详细设置(二)
- 下一篇: 关于linux驱动程序的学习