❝不論前端仍是後端,再學會Linux的基礎上,還應該學會寫一些簡單的Shell。不止是工做,平常中想作一些東西,若是手動作就很累人也費時間,若是你會用Shell腳本處理就很簡單了,本文普及的shell的一些基礎知識。後面還會持續更新。前端
❞
變量只能由大小寫字母,數字和下劃線組成。
變量名稱不能以數字開頭。
變量能夠存儲數字類型或者字符串類型。
變量賦值等號兩邊不能有空格。
字符串的變量能夠用單引號或者雙引號括起來。
複製代碼
定義變量:mysql
➜ ~ name="xiaoka"
➜ ~ age=2 複製代碼
無效的定義web
[root@iz2ze0ajic0vbv28hcdctpz hello]# 1212=sfds
-bash: 1212=sfds: 未找到命令 [root@iz2ze0ajic0vbv28hcdctpz hello]# ?aasd=hehe -bash: ?aasd=hehe: 未找到命令 複製代碼
變量的調用使用$符號或者$符號加上花括號。通常來說使用花括號的用法。 舉例說明:sql
[root@iz2ze0ajic0vbv28hcdctpz hello]# apple=hongfushi
[root@iz2ze0ajic0vbv28hcdctpz hello]# echo $applepen [root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${apple}pen hongfushipen 複製代碼
若是不加花括號,就會讀成applepen爲一個變量,所以解析產生了歧義。shell
自定義變量: 定義變量database:apache
[root@iz2ze0ajic0vbv28hcdctpz hello]# database=mysql
[root@iz2ze0ajic0vbv28hcdctpz hello]# echo $database mysql [root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${database} mysql 複製代碼
環境變量: 查看全局環境變量:後端
[root@iz2ze0ajic0vbv28hcdctpz ~]# printenv
XDG_SESSION_ID=2044 HOSTNAME=iz2ze0ajic0vbv28hcdctpz TERM=xterm-256color SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=113.44.42.209 56074 22 SSH_TTY=/dev/pts/1 USER=root LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45: MAVEN_HOME=/usr/local/apache-maven-3.6.0 MAIL=/var/spool/mail/root PATH=/usr/local/apache-maven-3.6.0/bin:/usr/local/jdk1.8.0_191/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin PWD=/root JAVA_HOME=/usr/local/jdk1.8.0_191 LANG=zh_CN.UTF-8 HISTCONTROL=ignoredups SHLVL=1 HOME=/root LOGNAME=root CLASSPATH=.:/lib/dt.jar:/lib/tools.jar SSH_CONNECTION=113.44.42.209 56074 172.17.187.244 22 LC_CTYPE=zh_CN.UTF-8 LESSOPEN=||/usr/bin/lesspipe.sh %s XDG_RUNTIME_DIR=/run/user/0 _=/usr/bin/printenv 複製代碼
定義一個環境變量bash
[root@iz2ze0ajic0vbv28hcdctpz ~]# export kaka="kaka"
[root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka kaka=kaka 複製代碼
刪除環境變量app
[root@iz2ze0ajic0vbv28hcdctpz ~]# unset kaka
[root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka 複製代碼
w若是長期使用,能夠把它們寫在配置文件中。 /etc/profile 或者 用戶家目錄的.bash_profileless
位置變量 : 咱們先定義一個shell。
[root@iz2ze0ajic0vbv28hcdctpz ~]# cat test.sh
#!/bin/bash echo "執行的文件: $0" echo "第一個參數: $1" echo "第二個參數: $2" 複製代碼
執行查看結果。
[root@iz2ze0ajic0vbv28hcdctpz ~]# chmod +x test.sh
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2 執行的文件: ./test.sh 第一個參數: 1 第二個參數: 2 複製代碼
預約義變量: 經常使用的預約義變量有以下幾個。
#!/bin/bash echo "執行的文件: $0" echo "第一個參數: $1" echo "第二個參數: $2" echo "全部參數: $*" echo "當前腳本的pid: $" echo "腳本參數個數: $#" 複製代碼
查看執行結果
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2
執行的文件: ./test.sh 第一個參數: 1 第二個參數: 2 全部參數: 1 2 當前腳本的pid: 30170 腳本參數個數: 2 複製代碼
查看上一個命令執行結果。
[root@iz2ze0ajic0vbv28hcdctpz hello]# ls
test [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $? 0 複製代碼
shell也是一門語言其實和其餘的語言運算符大同小異,不過這裏咱們仍是來講一下。本節說一下運算符相關內容。
命令: expr
做用: 求表達式的值
語法: expr 表達式
規則:
運算符號兩邊要有空格
遇到特殊符號如*號須要在前面加反斜槓
空格和特殊字符串須要用引號括起來
操做:(先編寫一個運算相關的shell腳本)
#!/bin/bash
i=1 j=2 addition=`expr $i + $j` subtraction=`expr $i - $j` multiplication=`expr $j \* $j` division=`expr $j / $i` mod=`expr $j % $i` echo "addition=${addition} , subtraction=${subtraction} , multiplication=${multiplication} , division=${division} , mod=${mod}" if [ $i == $j ] then echo "i 等於 j" fi if [ $i != $j ] then echo "i 不等於 j" fi 複製代碼
查看結果:
➜ ~ ./operation.sh addition=3 , subtraction=-1 , multiplication=4 , division=2 , mod=0 i 不等於 j 複製代碼
操做:(編寫腳本)
#!/bin/bash
num1=5 num2=8 if [ $num1 -eq $num2 ] then echo "$num1 是否等於 $num2 : num1 等於 num2" else echo "$num1 是否等於 $num2: num1 不等於 num2" fi if [ $num1 -ne $num2 ] then echo "$num1 是否不等於 $num2: num1 不等於 num2" else echo "$num1 是否不等於 $num2 : num1 等於 num2" fi if [ $num1 -gt $num2 ] then echo "$num1 是否大於 $num2: num1 大於 num2" else echo "$num1 是否大於 $num2: num1 不大於 num2" fi if [ $num1 -lt $num2 ] then echo "$num1 是否小於 $num2: num1 小於 num2" else echo "$num1 是否小於 $num2: num1 不小於 num2" fi if [ $num1 -ge $num2 ] then echo "$num1 是否大於等於 $num2: num1 大於或等於 num2" else echo "$num1 是否大於等於 $num2: num1 小於 num2" fi if [ $num1 -le $num2 ] then echo "$num1 是否小於等於 $num2: num1 小於或等於 num2" else echo "$num1 是否小於等於 $num2: num1 大於 num2" fi 複製代碼
操做結果:
➜ ~ ./relation.sh 5 是否等於 8: num1 不等於 num2 5 是否不等於 8: num1 不等於 num2 5 是否大於 8: num1 不大於 num2 5 是否小於 8: num1 小於 num2 5 是否大於等於 8: num1 小於 num2 5 是否小於等於 8: num1 小於或等於 num2 複製代碼
編寫腳本:
#!/bin/bash
num1=3 num2=23 if [ $num1 != $num2 ] then echo "$num1 != $num2 : num1 不等於 num2" else echo "$num1 != $num2: num1 等於 num2" fi if [ $num1 -lt 25 -a $num2 -gt 15 ] then echo "$num1 小於 25 且 $num2 大於 15 : 返回 true" else echo "$num1 小於 25 且 $num2 大於 15 : 返回 false" fi if [ $num1 -lt 25 -o $num2 -gt 25 ] then echo "$num1 小於 25 或 $num2 大於 25 : 返回 true" else echo "$num1 小於 25 或 $num2 大於 25 : 返回 false" fi 複製代碼
查看結果:
➜ ~ ./bool.sh
3 != 23 : num1 不等於 num2 3 小於 25 且 23 大於 15 : 返回 true 3 小於 25 或 23 大於 25 : 返回 true 複製代碼
編寫腳本:
#!/bin/bash
apple="apple" pen="pen" if [ $apple = $pen ] then echo "$apple = $pen : apple 等於 pen" else echo "$apple = $pen: apple 不等於 pen" fi if [ $apple != $pen ] then echo "$apple != $pen : apple 不等於 pen" else echo "$apple != $pen: apple 等於 pen" fi if [ -z $apple ] then echo "-z $apple : 字符串長度爲 0" else echo "-z $apple : 字符串長度不爲 0" fi if [ -n "$apple" ] then echo "-n $apple : 字符串長度不爲 0" else echo "-n $apple : 字符串長度爲 0" fi if [ $apple ] then echo "$apple : 字符串不爲空" else echo "$apple : 字符串爲空" fi 複製代碼
執行結果:
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./string.sh
apple = pen: apple 不等於 pen apple != pen : apple 不等於 pen -z apple : 字符串長度不爲 0 -n apple : 字符串長度不爲 0 apple : 字符串不爲空 複製代碼
編寫腳本:
#!/bin/bash
num1=5 num2=8 if [[ $num1 -lt 10 && $num2 -gt 5 ]] then echo "返回 true" else echo "返回 false" fi if [[ $num1 -lt 10 || $num2 -gt 5 ]] then echo "返回 true" else echo "返回 false" fi 複製代碼
執行結果:
[root@iz2ze0ajic0vbv28hcdctpz ~]# ./logic.sh
返回 true 返回 true 複製代碼
編寫腳本:
~ cat testfile.sh
#!/bin/bash file="/root/testfile.sh" if [ -r $file ] then echo "該文件可讀" else echo "該文件不可讀" fi if [ -x $file ] then echo "該文件可執行" else echo "該文件不可執行" fi if [ -w $file ] then echo "該文件可寫" else echo "該文件不可寫" fi if [ -f $file ] then echo "該文件是普通文件" else echo "該文件是非普通文件" fi if [ -s $file ] then echo "該文件爲空" else echo "該文件不爲空" fi if [ -d $file ] then echo "該文件是目錄" else echo "該文件不是目錄" fi 複製代碼
執行腳本:
➜ ~ ./testfile.sh 該文件可讀 該文件可執行 該文件可寫 該文件是普通文件 該文件爲空 該文件不是目錄 複製代碼
其實流程控制的本質是差很少的,只是在語法上稍微有些差異,本節咱們來盤一盤。
流程示意圖:
舉例:
➜ if cat if-one.sh
#!/bin/bash a=10 if [ a > 5 ] then echo "a 大於 5" fi 複製代碼
執行結果:
➜ if ./if-one.sh
a 大於 5 複製代碼
流程示意圖:
舉例:
➜ if cat if-double.sh
#!/bin/bash age=18 if [ $age -ge 18 ]; then echo "成年" else echo "未成年" fi 複製代碼
執行結果:
➜ if ./if-double.sh
成年 複製代碼
流程示意圖:
舉例:
➜ if cat if-multi.sh
#!/bin/bash money=10 if [ $money -lt 1 ] then echo "1塊錢都沒有的比皮卡丘決定在家吃土" elif [ $money -ge 1 -a $money -lt 5 ] then echo "老闆我要大白兔奶糖" elif [ $money -ge 5 -a $money -le 10 ] then echo "老闆我要巧克力" else echo "老闆給我拿個雞腿" fi 複製代碼
執行結果:
➜ if ./if-multi.sh
老闆我要巧克力 複製代碼
❝本文更新了一些shell的基礎知識,若是要學就不要複製,請手打。持續更新。。。⛽️
❞
本文使用 mdnice 排版