shell 语言相关

2019-04-12  本文已影响0人  土卡拉

shell学习记录

shell是什么

简单来说,shell是一个命令解释器,将用户输入的命令解释给操作系统内核。它既是命令语言又是程序设计语言。Shell 同时也是一个程序,它的一端连接着 UNIX/Linux 内核,另一端连接着用户和其它应用程序;换句话说,Shell 是用户和应用程序与内核沟通的桥梁。
类型:sh、bash、ash、csh(tcsh)、ksh、zch

shell的功能

linux运维工程师的工作细节

什么是脚本

简而言之,脚本就是可执行的代码 shell脚本扩展名一般就是.sh(从上到下,逐句执行)

shell相关操作(交互)

不想修改权限的操作:/bin/bash 脚本名.sh

对于普通用户,Base shell 默认的提示符是美元符号$;对于超级用户(root 用户),Bash Shell 默认的提示符是井号#。该符号表示 Shell 等待输入命令。

shell相关语法

变量与变量作用域

变量

赋值号 = 的周围不能有空格, 值没有空白符变量可以不用引号,值有空白符一定要用引号,单引号不能解释特殊变量(原样输出使用),所以建议使用双引号

特殊变量

位置参数(与Python中的关键字参数)与特殊参数

不用双引号时候没有区别(都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔),当它们被双引号" "包含时,就会有区别了(需要通过for循环才能看出区别):
"*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。 "@"仍然将每个参数都看作一份数据,彼此之间是独立的。
"?",所谓退出状态,就是上一个命令执行后的返回结果。退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1 "?",获取函数的返回值

#!/bin/bash
#得到两个数相加的和
function add(){
    return `expr $1 + $2`
}
add 23 50  #调用函数
echo $?  #获取函数返回值

变量作用域

有的变量可以在当前 Shell 会话中使用,这叫做全局变量(global variable),函数中变量名前面未加local的也是全局变量,全局变量只在当前 Shell 会话中有效,如果使用export命令(export 变量名)将它导出,那么它就在所有的子 Shell 中也有效了,这称为“环境变量”(环境变量只能向下传递而不能向上传递,即“传子不传父”。可以通过exit层层退出shell);
有的变量只能在函数内部使用,这叫做局部变量(local variable);
而有的变量还可以在其它 Shell 中使用,这叫做环境变量(environment variable)。

如果想让环境变量在所有 Shell 中都有效,并且能够永久保存,在关闭 Shell 后也不丢失,那么就需要把环境变量写入启动文件。

字符串

  1. 由单引号' '包围的字符串:
    任何字符都会原样输出,在其中使用变量是无效的。
    字符串中不能出现单引号,即使对单引号进行转义也不行。
  2. 由双引号" "包围的字符串:
    如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
    字符串中可以出现双引号,只要它被转义了就行。
  3. 不被引号包围的字符串
    不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
    字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。
  1. 指定位置开始截取:
    • 字符创左边开始截取:{string: start :length}string 是要截取的字符串,start 是起始位置(从左边开始,从 0 开始计数),length 是要截取的长度(省略的话表示直到字符串的末尾) 字符串右边开始截取:{string: 0-start :length}

从左边开始计数时,起始数字是 0(这符合程序员思维);从右边开始计数时,起始数字是 1(这符合常人思维)。计数方向不同,起始数字也不同。
不管从哪边开始计数,截取方向都是从左到右。

  1. 制定字符开始截取
    • 使用 # 号截取右边字符 ${string#*chars} 忽略第一个chars左边所有字符(截取内容不包含这个chars) 用## 匹配最后一个才会结束
    • 使用 % 号截取左边字符 ${string%chars* } 请注意 * 的位置,因为要截取 chars 左边的字符,而忽略 chars 右边的字符,所以*应该位于 chars 的右侧。
八种用法:
${string: start :length}    从 string 字符串的左边第 start 个字符开始,向右截取 length 个字符。
${string: start}    从 string 字符串的左边第 start 个字符开始截取,直到最后。
${string: 0-start :length}  从 string 字符串的右边第 start 个字符开始,向右截取 length 个字符。
${string: 0-start}  从 string 字符串的右边第 start 个字符开始截取,直到最后。
${string#*chars}    从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string##*chars}   从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 右边的所有字符。
${string%*chars}    从 string 字符串第一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。
${string%%*chars}   从 string 字符串最后一次出现 *chars 的位置开始,截取 *chars 左边的所有字符。

数组

常用的 Bash Shell 只支持一维数组,不支持多维数组

运算符与表达式

shell默认所有变量都是字符串,执行数学计算需要用[]括起来
a=100
echo $[$a+10]
echo $[$a / 2]
echo $[$a * 2]
echo $[$a - 80]
echo $[10 % 2]

echo $((3 + 5))
echo $((10/2))
echo $((10/3))  #3 整除
echo $((10*3))
echo $((10%3))

let a=5+6
echo $a
let a+=10
echo $a

echo `expr 3 + 5`  #也可以用expr进行计算

分支语句

一、单分支if语句

  1. 语法格式
    复制代码
    if [ 条件判断式 ]; then
    程序
    fi

或者

if [ 条件判断式 ]
then
程序
fi

注意:中括号和条件判断式之间必须有空格
复制代码

  1. 示例1:判断登陆的用户是否是root
    复制代码

!/bin/bash

if [ "$USER" == root ];then
echo "Login User is root"
fi

#########或者#########

!/bin/bash

if [ "$USER" == root ]
then
echo "Login User is root"
fi
复制代码

  1. 示例2:判断分区使用率
    复制代码

!/bin/bash

test=(df -h | grep sda1 | awk '{print5}' | cut -d '%' -f 1)

if [ $test -ge 90 ];then
echo "Warning! /dev/sda1 is full!"
fi
复制代码

二、双分支if语句

  1. 语法格式
    复制代码
    if [ 条件判断式 ]; then
    条件成立时,执行的程序
    else
    条件不成立时,执行的程序
    fi

或者

if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的程序
fi
复制代码

  1. 示例1:输入一个文件,判断是否存在
    复制代码

!/bin/bash

read -p "Please input a file:" file

if [ -f file ]; then echo "File:file exists!"
else
echo "File: $file not exists!"
fi
复制代码

  1. 示例2:判断apache服务是否启动了,如果没有启动,就代码启动
    复制代码

!/bin/bash

test=$(ps aux | grep httpd | grep -v 'grep' | wc -l)

if [ test -gt 0 ]; then echo "(date) httpd is running!"
else
echo "$(date) httpd isn't running, will be started!"
/etc/init.d/httpd start
fi
复制代码

三、多分支if语句

  1. 语法格式
    复制代码
    if [ 条件判断式1 ]; then
    当条件判断式1成立时,执行程序1
    elif [ 条件判断式2 ]; then
    当条件判断式2成立时,执行程序2
    .....省略更多条件.....
    else
    当所有条件都不成立时,最后执行此程序
    fi
    复制代码
  1. 示例:实现计算器
    复制代码

!/bin/bash

输入数字a,数字b和操作符

read -p "Please input number a:" a
read -p "Please input number b:" b
read -p "Please input operator[+|-|*|/]:" opt

判断输入内容的正确性

testa=(echoa | sed 's/[0-9]//g')
testb=(echoa | sed 's/[0-9]//g')
testopt=(echoopt | sed 's/[+|-|*|/]//g')

if [ -n "testa" -o -n "testb" -o -n "testopt" ]; then echo "input content is error!" exit 1 elif [ "opt" == "+" ]; then
result=((a+b)) elif [ "opt" == "-" ]; then
result=((a-b)) elif [ "opt" == "" ]; then
result=((a
b)) else result=((a/b))
fi

echo "a opt b =result"
复制代码

四、case语句
case语句和if...elif...else语句都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

  1. 语法格式
    复制代码
    case $变量名 in
    "值1")
    如果变量的值等于值1,则执行程序1
    ;;
    "值2")
    如果变量的值等于值2,则执行程序2
    ;;
    .....省略其他分支.....
    *)
    如果变量的值都不是以上的值,则执行此程序
    ;;
    esac
    复制代码
  1. 示例:判断用户输入
    复制代码

!/bin/bash

read -p "Please choose yes/no:" cmd

case $cmd in
"yes")
echo "Your choose is yes!"
;;
"no")
echo "Your choose is no!"
;;
*)
echo "Your choose is error!"
;;
esac
复制代码

循环语句

一、for循环

  1. 语法格式1
    for 变量 in 值1 值2 值3 ...
    do
    程序
    done
    说明:程序将遍历所有的值,赋值给变量,然后在执行程序。也就是说,后面接多少个值,程序就循环多少次。

  2. 示例1:遍历5个数,进行输出
    复制代码

!/bin/bash

for i in 1 2 3 4 5
do
echo $i
done

输出结果

1
2
3
4
5
复制代码

  1. 示例2:遍历目录下的所有文件,进行输出文件名

!/bin/bash

for file in (ls) #注:ls会将当前目录下的所有文件列出来,然后逐个赋值给file,就可以逐个输出了 do echofile
done

  1. 语法格式2
    for (( 初始值;循环控制条件;变量变化 ))
    do
    程序
    done

说明:这种格式和C语言for循环的格式是一样的,区别只是需要用双括号括住循环条件。

  1. 示例1:计算1到100的总和
    复制代码

!/bin/bash

sum=0
for ((i=1;i<=100;i=i+1))
do
sum=((sum+i)) #同样可以使用,sum=[sum+i]
done

echo $sum

输出

5050
复制代码

二、while循环

  1. 语法格式
    while [条件判断式]
    do
    程序
    done

说明:当条件判断式成立时,才会执行程序,直到条件判断式不成立时,才退出循环。

  1. 示例:计算1到100的总和
    复制代码

!/bin/bash

i=1
sum=0

while [ i -le 100 ] do sum=(( sum+i ))
i=$(( i+1 ))
done

echo $sum

输出

5050
复制代码

三、until循环

  1. 语法格式
    until [条件判断式]
    do
    程序
    done

说明:until循环和while循环是相反的,当条件判断式不成立时,才会执行程序,直到条件判断式成立,才退出循环。

  1. 示例:计算1到100的总和
    复制代码

!/bin/bash

i=1
sum=0

until [ i -gt 100 ] do sum=(( sum+i ))
i=$(( i+1 ))
done

echo $sum

输出结果

5050
复制代码

函数(实现模块化)

shell常用内置命令

上一篇下一篇

猜你喜欢

热点阅读