shell if判斷和for循環常見寫法

shell if判斷和for循環常見寫法

轉自:

Shell中for循環的幾個常用寫法

Shell中if 條件判斷總結

if常見寫法

一、if的基本語法:

if [ command ];then符合該條件執行的語句
elif [ command ];then符合該條件執行的語句
else符合該條件執行的語句
fi

bash shell會按順序執行if語句,如果command執行后且它的返回狀態是0,則會執行符合該條件執行的語句,否則后面的命令不執行,跳到下一條命令。

當有多個嵌套時,只有第一個返回0退出狀態的命令會導致符合該條件執行的語句部分被執行,如果所有的語句的執行狀態都不為0,則執行else中語句。

返回狀態:最后一個命令的退出狀態,或者當沒有條件是真的話為0。

二、文件/文件夾(目錄)判斷

[ -b FILE ] 如果 FILE 存在且是一個塊特殊文件則為真。
[ -c FILE ] 如果 FILE 存在且是一個字特殊文件則為真。
[ -d DIR ] 如果 FILE 存在且是一個目錄則為真。
[ -e FILE ] 如果 FILE 存在則為真。
[ -f FILE ] 如果 FILE 存在且是一個普通文件則為真。
[ -g FILE ] 如果 FILE 存在且已經設置了SGID則為真。
[ -k FILE ] 如果 FILE 存在且已經設置了粘制位則為真。
[ -p FILE ] 如果 FILE 存在且是一個名字管道(F如果O)則為真。
[ -r FILE ] 如果 FILE 存在且是可讀的則為真。
[ -s FILE ] 如果 FILE 存在且大小不為0則為真。
[ -t FD ] 如果文件描述符 FD 打開且指向一個終端則為真。
[ -u FILE ] 如果 FILE 存在且設置了SUID (set user ID)則為真。
[ -w FILE ] 如果 FILE存在且是可寫的則為真。
[ -x FILE ] 如果 FILE 存在且是可執行的則為真。
[ -O FILE ] 如果 FILE 存在且屬有效用戶ID則為真。
[ -G FILE ] 如果 FILE 存在且屬有效用戶組則為真。
[ -L FILE ] 如果 FILE 存在且是一個符號連接則為真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read則為真。
[ -S FILE ] 如果 FILE 存在且是一個套接字則為真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not則為真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在則為真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的設備和節點號則為真。

三、字符串判斷

[ -z STRING ] 如果STRING的長度為零則為真 ,即判斷是否為空,空即是真;
[ -n STRING ] 如果STRING的長度非零則為真 ,即判斷是否為非空,非空即是真;
[ STRING1 = STRING2 ] 如果兩個字符串相同則為真 ;
[ STRING1 != STRING2 ] 如果字符串不相同則為真 ;
[ STRING1 ]  如果字符串不為空則為真,與-n類似;

四、數值判斷

INT1 -eq INT2           INT1和INT2兩數相等為真 ,=
INT1 -ne INT2           INT1和INT2兩數不等為真 ,<>
INT1 -gt INT2            INT1大于INT1為真 ,>
INT1 -ge INT2           INT1大于等于INT2為真,>=
INT1 -lt INT2             INT1小于INT2為真 ,<</div>
INT1 -le INT2             INT1小于等于INT2為真,<=

五、復雜邏輯判斷

[ ! EXPR ]       邏輯非,如果 EXPR 是false則返回為真。
[ EXPR1 -a EXPR2 ]      邏輯與,如果 EXPR1 and EXPR2 全真則返回為真。
[ EXPR1 -o EXPR2 ]      邏輯或,如果 EXPR1 或者 EXPR2 為真則返回為真。
[  ] || [  ]           用OR來合并兩個條件
[  ] && [  ]        用AND來合并兩個條件

六、其他判斷

[ -t FD ]  如果文件描述符 FD (默認值為1)打開且指向一個終端則返回為真
[ -o optionname ]  如果shell選項optionname開啟則返回為真

七、if高級特性

  • 雙圓括號 (( )):表示數學表達式在判斷命令中只允許在比較中進行簡單的算術操作,而雙圓括號提供更多的數學符號,而且在雙圓括號里面的’>‘,’<'號不需要轉意。

  • 雙方括號 [[ ]]:表示高級字符串處理函數雙方括號中判斷命令使用標準的字符串比較,還可以使用匹配模式,從而定義與字符串相匹配的正則表達式。

  • 雙括號的作用:在shell中,[ $a != 1 || $b = 2 ] 是不允許出,要用 [ $a != 1 ] || [ $b = 2 ] ,而雙括號就可以解決這個問題的,[[ $a != 1 || $b = 2 ]] 。又比如這個 [ "$a" -lt "$b" ] ,也可以改成雙括號的形式 (("$a" < "$b"))

八、注意

  1. [ ] 表示條件測試。注意這里的空格很重要。要注意在 [ 后面和 ] 前面都必須要有空格
  2. 在 shell 中,thenfi 是分開的語句。如果要在同一行里面輸入,則需要用分號將他們隔開。
  3. 注意 if 判斷中對于變量的處理,需要加引號,以免一些不必要的錯誤。沒有加雙引號會在一些含空格等的字符串變量判斷的時候產生錯誤。比如 [ -n "$var" ] 如果 var 為空會出錯
  4. 判斷是不支持浮點值的
  5. 如果只單獨使用 > 或者 < 號,系統會認為是輸出或者輸入重定向,雖然結果顯示正確,但是其實是錯誤的,因此要對這些符號進行轉義
  6. 在默認中,運行if語句中的命令所產生的錯誤信息仍然出現在腳本的輸出結果中
  7. 使用 -z 或者 -n 來檢查長度的時候,沒有定義的變量也為0
  8. 空變量和沒有初始化的變量可能會對 shell 腳本測試產生災難性的影響,因此在不確定變量的內容的時候,在測試號前使用 -n 或者 -z 測試一下
  9. $? 變量包含了之前執行命令的退出狀態(最近完成的前臺進程)(可以用于檢測退出狀態)

if常見實例

  1. 判斷目錄 $doiido 是否存在,若不存在,則新建一個

    if [ ! -d "$doiido"]; thenmkdir "$doiido"
    fi
    
  2. 判斷普通文件 $doiido 是否存,若不存在,則新建一個

    if [ ! -f "$doiido" ]; thentouch "$doiido"
    fi
    
  3. 判斷 $doiido 是否存在并且是否具有可執行權限

    if [ ! -x "$doiido"]; thenmkdir "$doiido"chmod +x "$doiido"
    fi
    
  4. 是判斷變量 $doiido 是否有值

    if [ ! -n "$doiido" ]; thenecho "$doiido is empty"exit 0
    fi
    
  5. 兩個變量判斷是否相等

    if [ "$var1" = "$var2" ]; thenecho '$var1 eq $var2'
    elseecho '$var1 not eq $var2'
    fi
    
  6. 測試退出狀態

    if [ $? -eq 0 ];thenecho 'That is ok'
    fi
    
  7. 數值的比較

    if [ "$num" -gt "150" ]echo "$num is biger than 150"
    fi
    
  8. a>b且a<c

    (( a > b )) && (( a < c ))
    [[ $a > $b ]] && [[ $a < $c ]]
    [ $a -gt $b -a $a -lt $c ]
    
  9. a>b或a<c

    (( a > b )) || (( a < c ))
    [[ $a > $b ]] || [[ $a < $c ]]
    [ $a -gt $b -o $a -lt $c ]
    
  10. 檢測執行腳本的用戶

    if [ "$(whoami)" != 'root' ]; thenecho "You have no permission to run $0 as non-root user."exit 1;
    fi
    

    上面的語句也可以使用以下的精簡語句

    [ "$(whoami)" != 'root' ] && ( echo "You have no permission to run $0 as non-root user."; exit 1 )
    
  11. 正則表達式

    doiido="hero"
    if [[ "$doiido" == h* ]];then echo "hello,hero"
    fi
    

其他例子

  1. 查看當前操作系統類型

    #!/bin/sh
    SYSTEM=`uname -s`
    if [ $SYSTEM = "Linux" ] ; thenecho "Linux"
    elif [ $SYSTEM = "FreeBSD" ] ; thenecho "FreeBSD"
    elif [ $SYSTEM = "Solaris" ] ; thenecho "Solaris"
    elseecho "What?"
    fi
    
  2. if利用read傳參判斷

    #!/bin/bash
    read -p "please input a score:" score
    echo -e "your score [$score] is judging by sys now"if [ "$score" -ge "0" ]&&[ "$score" -lt "60" ];thenecho "sorry,you are lost!"
    elif [ "$score" -ge "60" ]&&[ "$score" -lt "85" ];thenecho "just soso!"
    elif [ "$score" -le "100" ]&&[ "$score" -ge "85" ];thenecho "good job!"
    elseecho "input score is wrong , the range is [0-100]!"
    fi
    
  3. 判斷文件是否存在

    #!/bin/sh
    today=`date -d yesterday +%y%m%d`
    file="apache_$today.tar.gz"
    cd /home/chenshuo/shell
    if [ -f "$file" ];thenecho "OK"
    elseecho "error $file" >error.logmail -s "fail backup from test" loveyasxn924@126.com <error.log
    fi
    
  4. 這個腳本在每個星期天由cron來執行。如果星期的數是偶數,他就提醒你把垃圾箱清理

    #!/bin/bash
    WEEKOFFSET=$[ $(date +"%V") % 2 ]if [ $WEEKOFFSET -eq "0" ]; thenecho "Sunday evening, put out the garbage cans." | mail -s "Garbage cans out" your@your_domain.org
    fi
    
  5. 掛載硬盤腳本(windows下的ntfs格式硬盤)

    #! /bin/sh
    dir_d=/media/disk_d
    dir_e=/media/disk_e
    dir_f=/media/disk_fa=`ls $dir_d | wc -l`
    b=`ls $dir_e | wc -l`
    c=`ls $dir_f | wc -l`echo "checking disk_d..."
    if [ $a -eq 0 ]; thenecho "disk_d is not exsit,now creating..."sudo mount -t ntfs /dev/disk/by-label/software /media/disk_d
    elseecho "disk_d exits"
    fiecho "checking disk_e..."
    if [ $b -eq 0 ]; thenecho "disk_e is not exsit,now creating..."sudo mount -t ntfs /dev/disk/by-label/elitor /media/disk_e
    elseecho "disk_e exits"
    fiecho "checking disk_f..."
    if [ $c -eq 0 ]; thenecho "disk_f is not exsit,now creating..."sudo mount -t ntfs /dev/disk/by-label/work /media/disk_f
    elseecho "disk_f exits"
    fi

for循環常見寫法

第一類:數字類循環

寫法一

#!/bin/bash
for((i=1; i<=10; i++));
doecho $(expr $i \* 3 + 1);
done

寫法二

#!/bin/bashfor i in $(seq 1 10)
doecho $(expr $i \* 3 + 1);
done

寫法三

#!/bin/bashfor i in {1..10}
doecho $(expr $i \* 3 + 1);
done

寫法四

#!/bin/bashawk 'BEGIN{for(i=1; i<=10; i++) print i}'

第二類:字符類循環

寫法一

#!/bin/bashfor file in `ls`;
doecho ${file} is file/dir name\! ;
done

寫法二

#!/bin/bashfor i in $* ;
doecho $i is input chart\! ;
done

注意 $* 是接收到的變量,故運行該測試程序時可以:

bash test.sh args1 args2

寫法三

#!/bin/bashfor i in f1 f2 f3 ;
doecho $i is appoint ;
done

寫法四

#!/bin/bashlist="rootfs usr data data2"
for i in $list;
doecho $i is appoint ;
done

第三類:路徑相關

寫法一

#!/bin/bashfor file in /proc/*;
doecho $file is file path \! ;
done

寫法二

#!/bin/bashfor file in $(ls *.sh)
doecho $file is file path \! ;
done

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/532475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/532475.shtml
英文地址,請注明出處:http://en.pswp.cn/news/532475.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題

關于pytorch使用多個dataloader并使用zip和cycle來進行循環時出現的顯存泄漏的問題 如果我們想要在 Pytorch 中同時迭代兩個 dataloader 來處理數據&#xff0c;會有兩種情況&#xff1a;一是我們按照較短的 dataloader 來迭代&#xff0c;長的 dataloader 超過的部分就丟棄掉…

neovim及coc.nvim自動補全初探

neovim及coc.nvim自動補全初探 安裝 # mac # 安裝 brew install neovim # 查看neovim安裝路徑 brew list nvim# ubuntu apt install neovim習慣了打開 vi/vim 的方式&#xff0c;可以用個 alias 在 ~/.zshrc 中設置一下&#xff1a; alias vi"nvim"插件 vim-plug…

sed 簡明教程

sed 簡明教程 轉自&#xff1a;https://coolshell.cn/articles/9104.html awk于1977年出生&#xff0c;今年36歲本命年&#xff0c;sed比awk大2-3歲&#xff0c;awk就像林妹妹&#xff0c;sed就是寶玉哥哥了。所以 林妹妹跳了個Topless&#xff0c;他的哥哥sed坐不住了&#xf…

awk 簡明教程

awk 簡明教程 轉自&#xff1a;https://coolshell.cn/articles/9070.html 有一些網友看了前兩天的《Linux下應該知道的技巧》希望我能教教他們用awk和sed&#xff0c;所以&#xff0c;出現了這篇文章。我估計這些80后的年輕朋友可能對awk/sed這類上古神器有點陌生了&#xff0c…

應該知道的LINUX技巧

應該知道的LINUX技巧 轉自&#xff1a;https://coolshell.cn/articles/8883.html 這篇文章來源于Quroa的一個問答《What are some time-saving tips that every Linux user should know?》—— Linux用戶有哪些應該知道的提高效率的技巧。我覺得挺好的&#xff0c;總結得比較好…

[深度][PyTorch] DDP系列第一篇:入門教程

[深度][PyTorch] DDP系列第一篇&#xff1a;入門教程 轉自&#xff1a;[原創][深度][PyTorch] DDP系列第一篇&#xff1a;入門教程 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I…

[深度][PyTorch] DDP系列第二篇:實現原理與源代碼解析

[深度][PyTorch] DDP系列第二篇&#xff1a;實現原理與源代碼解析 轉自&#xff1a;https://zhuanlan.zhihu.com/p/187610959 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I do! …

[深度][PyTorch] DDP系列第三篇:實戰與技巧

[深度][PyTorch] DDP系列第三篇&#xff1a;實戰與技巧 轉自&#xff1a;https://zhuanlan.zhihu.com/p/250471767 零. 概覽 想要讓你的PyTorch神經網絡在多卡環境上跑得又快又好&#xff1f;那你definitely需要這一篇&#xff01; No one knows DDP better than I do! – – …

PIL、OpenCV中resize算子實現不同的問題

PIL、OpenCV中resize算子實現不同的問題 測試圖像&#xff1a;https://raw.githubusercontent.com/TropComplique/ssd-pytorch/master/images/dogs-and-cats.jpg &#xff08;直接 wget 可獲得&#xff09; 測試版本&#xff1a; opencv-python 4.4.0.46Pillow 8.0.1 測試代…

mac X11 XQuartz的安裝與使用

mac X11 XQuartz的安裝與使用 本地系統&#xff1a;MacOS 12.4 遠程主機系統&#xff1a;Ubuntu 18.04 命令說明 ssh命令 ssh 命令大家很熟悉了&#xff0c;這里僅介紹與 X11 forwarding 相關的幾個選項。 本部分譯自 ssh 命令手冊&#xff0c;可見 man ssh -X &#xf…

機器學習:系統設計與實現 分布式訓練

機器學習系統:設計與實現 分布式訓練 轉自&#xff1a;https://openmlsys.github.io/chapter_distributed_training/index.html 隨著機器學習的進一步發展&#xff0c;科學家們設計出更大型&#xff0c;更多功能的機器學習模型&#xff08;例如說&#xff0c;GPT-3&#xff09;…

Linux命令行及各常用工具代理設置

Linux命令行及各常用工具代理設置 命令行代理設置 1 通過命令行指定 直接為當前命令行設置代理 對當前終端的全部工具&#xff08;apt、curl、wget、git 等全都有效&#xff09;以下僅以 http 代理為例&#xff0c;如果是其他協議&#xff08;如 socks 等&#xff09;自行改…

VimScript 五分鐘入門(翻譯)

VimScript 五分鐘入門&#xff08;翻譯&#xff09; 轉自&#xff1a;https://zhuanlan.zhihu.com/p/37352209 譯注&#xff1a;折騰 Vim 當然要能看懂和改寫相關腳本&#xff0c;而中文資料匱乏&#xff0c;缺一個提綱挈領的教程。本文翻譯自 Andrew Scala 的 《Five Minute V…

C++多線程推理、生產者消費者模式封裝

C多線程推理、生產者消費者模式封裝 tensorRT從零起步邁向高性能工業級部署&#xff08;就業導向&#xff09; 課程筆記&#xff0c;講師講的不錯&#xff0c;可以去看原視頻支持下。 深度學習推理中的多線程知識概覽 本章介紹的多線程主要是指算法部署時所涉及的多線程內容&a…

在Python中調用C/C++:cython及pybind11

在Python中調用C/C&#xff1a;cython及pybind11 轉自&#xff1a;https://zhuanlan.zhihu.com/p/442935082 Python寫起來非常方便, 但面對大量for循環的時候, 執行速度有些捉急. 原因在于, python是一種動態類型語言, 在運行期間才去做數據類型檢查, 這樣效率就很低(尤其是大規…

Pytorch導出onnx模型,C++轉化為TensorRT并實現推理過程

Pytorch導出onnx模型&#xff0c;C轉化為TensorRT并實現推理過程 前言 本文為旨在實現整個Python導出PyTorch模型&#xff0c;C轉化為TensorRT并實現推理過程過程&#xff0c;只與模型推理&#xff0c;模型部署相關&#xff0c;不涉及模型訓練。為突出整個部署過程而非具體模…

從零Makefile落地算法大項目,完整案例教程

從零Makefile落地算法大項目&#xff0c;完整案例教程 轉自&#xff1a;從零Makefile落地算法大項目&#xff0c;完整案例教程 作者&#xff1a;手寫AI 前言 在這里&#xff0c;你能學到基于Makefile的正式大項目的使用方式和考慮&#xff0c;相信我&#xff0c;其實可以很簡單…

PyTorch擴展自定義PyThonC++(CUDA)算子的若干方法總結

PyTorch擴展自定義PyThon/C(CUDA)算子的若干方法總結 轉自&#xff1a;https://zhuanlan.zhihu.com/p/158643792 作者&#xff1a;奔騰的黑貓 在做畢設的時候需要實現一個PyTorch原生代碼中沒有的并行算子&#xff0c;所以用到了這部分的知識&#xff0c;再不總結就要忘光了 &a…

給 Python 算法插上性能的翅膀——pybind11 落地實踐

給 Python 算法插上性能的翅膀——pybind11 落地實踐 轉自&#xff1a;https://zhuanlan.zhihu.com/p/444805518 作者&#xff1a;jesonxiang&#xff08;向乾彪&#xff09;&#xff0c;騰訊 TEG 后臺開發工程師 1. 背景 目前 AI 算法開發特別是訓練基本都以 Python 為主&…

chrome自動提交文件_收集文檔及提交名單統計

知乎文章若有排版問題請見諒&#xff0c;原文放在個人博客中【歡迎互踩&#xff01;】文叔叔文檔收集使用動機在我們的學習工作中&#xff0c;少不了要讓大家集體提交文件的情況&#xff0c;舉個最簡單的例子&#xff1a;收作業。 傳統的文件收集流程大致是&#xff1a;群內發出…