如何快速入手 Shell 脚本编程
Linux Shell 脚本编程之前一直没有系统的去学习,在写 Shell 脚本的时候总需要现查各种语法。本文章以编程语言的维度去系统的学习 Shell 脚本编程。 ShellLinux Shell 是与 Linux 系统交互的一个应用程序,我们通过这个程序可以操作 Linux 系统的内核服务。 执行 # List of acceptable shells for chpass(1). # Ftpd will not allow users to connect who are not using # one of these shells. /bin/bash /bin/csh /bin/ksh /bin/sh /bin/tcsh /bin/zsh /usr/local/bin/zsh 现代的 Linux 系统中 输入 Shell 脚本Shell 脚本 (Shell Script),是为 Shell 编写的一个脚本程序。我们说的 Shell 通常指的是 Shell 脚本。 Shell 变量Shell 脚本属于弱类型的脚本语言,在使用的时候不需要提前定义变量类型。
变量定义#!/bin/bash # 直接赋值 name="cizel" # 语句赋值 for file in `ls /etc` 变量使用#!/bin/bash # 定义变量 name name="cizel" # 使用美元 ($) 符号 echo $name # 使用美元 ($) 符号和括号结合,常用于字符串拼接 echo ${name} or #!/bin/bash # 高级用法 # 默认值:如果变量没有声明,使用默认值 ${var=DEFAULT} echo ${name="ok"} # output: ok # 默认值:如果变量没有声明,或者为空字符串,使用默认值 ${var:=DEFAULT} name="" echo ${name:="ok"} # output: ok Shell 数字运算Shell 中的数字运算可以采用
#!/bin/bash a=2 b="3" echo (($a + $b)) # output: 5 echo (($a - $b)) # output: -1 echo (($a * $b)) # output: 6 echo (($a / $b)) # output: 0 # 取模 / 求余 echo $(($a % $b)) # output: 1 # 乘方 echo $(($a ** $b)) # output: 8 # 复杂运算 echo $(($a + ($a * $b))) # output: 8 Shell 字符串Shell 的字符串与 PHP 的字符串相同,分为 字符串定义#!/bin/bash $name="cizel" #单引号中变量和符号不会被解析 echo 'my name is ${name}' # output: my name is ${name} #双引号中变量和符号会被解析 echo 'my name is ${name}' # output: my name is $shizhen 字符串连接#!/bin/bash name="cizel" echo $name $name # output:cizel cizel 字符串长度#!/bin/bash name="cizel" echo ${#name} # output: 5 字符串截取#!/bin/bash name="my name is cizel" echo ${name:2} # output: name is cizel echo ${name:2:5} # output: name 字符串删除${变量名#substring 正则表达式} 从字符串 开头 开始配备 ${变量名 %substring 正则表达式} 从字符串 结尾 开始配备 #!/bin/bash test="/home/work/.vimrc" echo ${test#/home} # output: /work/.vimrc or #!/bin/bash # 高级用法 test="/home/work/.vimrc" # 快速获取文件名 echo ${test##*/} # output: .vimrc # 快速获取路径 echo ${test%/*} # output: /home/work 字符串替换使用内置的字符串替换,会比 ${变量 / 查找 / 替换值} 一个"/"表示替换第一个,"//"表示替换所有。 #!/bin/bash test="/home/work/.vimrc" echo ${test/.vimrc/.zshrc} # output: /home/work/.zshrc echo ${test/w*k/cizel} # output: /home/cizel/.vimrc Shell 逻辑运算在 Shell 中,使用
数值比较数值比较的运算符和汇编语言中类似,常见的 5 种数值比较如下:
#!/bin/bash # 大于 test 3 -gt 2; echo $? # output: 0 # 小于 test 3 -lt 2; echo $? # output: 1 # 大于等于 test 3 -ge 2; echo $? # output: 0 # 小于等于 test 3 -le 2; echo $? # output: 1 # 不等于 test 3 -ne 2; echo $? # output: 0 # 等于 test 3 -eq 2; echo $? # output: 1 字符串比较字符串比较的运算符如下表:
#!/bin/bash # 字符串等于 test "my name is cizel" = "my name is cizel"; echo $? # output: 0 # 字符串不等 test "my name is cizel" = "my name is cz"; echo $? # output: 1 # 字符串长度判断 test -z "my name is cizel"; echo $? # output: 1 test -n "my name is cizel"; echo $? # output: 0 文件比较
#!/bin/bash ls -l # 当前目录有如下文件,lib 文件夹,run.sh 文件,sh 符号链接,当前角色:work # drwxr-xr-x 1 work work 4096 Jun 28 2018 lib # -rwxr-xr-x 1 work work 2364 Jul 7 2018 run.sh # lrwxrwxrwx 1 root root 4 May 26 2014 sh -> bash # 判断文件是否存在 test -e run.sh; echo $? # output: 0 # 判断目录是否存在 test -d lib; echo $? # output: 0 # 判断文件是否为常规文件 test -f run.sh; echo $? # output: 0 # 判断文件是否为符号链接 test -L sh; echo $? # output: 0 # 判断文件是否为符号链接 test -L sh; echo $? # output: 0 # 判断文件是否可读 / 写 / 执行 (当前角色 work,权限 rwx,可读可写可执行) test -r run.sh; echo $? # output: 0 test -w run.sh; echo $? # output: 0 test -x run.sh; echo $? # output: 0 逻辑连接与其他编程语言一样,Shell 中也有与或非运算符。用于连接逻辑判断条件,形成复合的逻辑判断。
#!/bin/bash # 与 test "1" = "1" -a "1" = "2"; echo $? # output: 1 # 或 test "1" = "1" -o "1" = "2"; echo $? # output: 0 #非 test ! "1" = "2"; echo $? # output: 0 Shell 选择结构Shell 中的选择语句和其他编程语言类似,支持 if,if-else,if-elif,if-elif-else,case-esac 常见的条件选择方式
if 选择#!/bin/bash var=`uname -s` if [ $var = "Linux" ]; then echo "Linux System" fi if-else 选择#!/bin/bash var=`uname -s` if [ $var = "Linux" ]; then echo "Linux System" else echo "Other System" fi if-elif 选择#!/bin/bash var=`uname -s` if [ $var = "Linux" ]; then echo "Linux System" elif [ $var = "FreeBSD" ]; then echo "FreeBSD System" fi if-elif-else 选择#!/bin/bash var=`uname -s` if [ $var = "Linux" ]; then echo "Linux System" elif [ $var = "FreeBSD" ]; then echo "FreeBSD System" else echo "Other System" fi case-esac 选择case-esac 与常用的 switch-case 类似,可以对比 if-elif-else 选择食用 #!/bin/bash var=`uname -s` case $var in "Linux") echo "Linux System" ;; "FreeBSD") echo "FreeBSD System" ;; *) echo "Other System" ;; esac Shell 循环结构for 循环常见的类似 c 语言的写法 #!/bin/bash # 打印 1-10,必须使用双括号,使符号转移 for ((i=1; i<=10; i++)); do echo $i done in 的方法 (常用) #!/bin/bash for i in {1..10}; do echo $i done while 循环#!/bin/bash count=1 while [ $count -lt 3 ]; do echo $count count=$((count + 1)) done until 循环直到条件为真时,停止循环 #!/bin/bash count=1 until [ $count -eq 3 ]; do echo $count count=$((count + 1)) done Shell 函数Shell 函数,使用 $1..$n 的方式接收参数 #!/bin/bash my_func() { echo "my function" echo "params 1: $1" echo "params 2: $2" echo "params 3: $3" } my_func 1 2 3 Shell 加载脚本Shell 中使用 # echo.sh echo() { command printf %sn "$*" 2>/dev/null } #!/bin/bash source echo.sh echo 123 相关链接
原文地址: https://www.cizel.cn/post/she... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |