Shell学习记录

本文详细介绍了Shell编程的基础知识,包括Shell脚本的概念、常见Shell环境、脚本解释器、变量使用、条件判断、循环控制、函数定义及输入输出重定向等核心内容。

Shell

shell既是一种命令语言,又是一种程序设计语言
Shell脚本(shell script)是一种为shell编程的脚本程序,而不是指开发shell自身

Shell环境

Shell编程需要脚本解释器,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)

脚本文件中使用 #! 告诉系统 后边指定的程序就是解释这个脚本文件的shell程序
通过 cat 命令来查看当前 Linux 系统的可用 Shell:

$ cat /etc/shells

运行Shell脚本

简单shell脚本例子
用vim 写个test.sh(扩展名不影响脚本执行)

#!/bin/bash
echo "Hello World !"

运行

chmod +x ./test.sh  #使脚本具有执行权限
./test.sh  #执行脚本

也可以直接使用解释器运行

/bin/bash test.sh

以后台的方式运行

./test.sh &

定时任务

crontab [option]
option:
-e: 编辑定时任务
-l :查询定时任务
-r:删除定时任务

*/1 * * * * 命令/或shell脚本
* 分别表示的是 分 小时 天 月 星期几
*/n 表示每隔n段时间执行一次
多个时间点用逗号连接,连续时间范围用-
*/1 1,5 * * *
*/1 * 5-6 * *

Shell 脚本

shell脚本的基本概念是一个命令列表中列出顺序执行。
刚才写的test.sh在其中添加两个命令

#!/bin/bash
echo "Hello World !"
pwd
ls

在输出Hello World ! 后,还会执行后面这两个命令。显示当前路径和列出文件

变量

一般变量大写,可以包含字母,数字,下划线

VAR_1="test1"
VAR_@="test2"
readonly VAR_1  #变量VAR_1不能被修改
echo $VAR_1 #会报错
unset VAR_2 #变量VAR_2设置的变量值会被取消
echo $VAR_2 #不会被输出

使用 $ 使用变量
单引号包含变量值的时候,内容不会被解析。原样输出
双引号包含变量值的时候,内容会被解析
当一个shell运行,存在主要三种类型的变量

  • 局部变量:只能在函数内部使用
  • 环境变量:可以在任何shell中使用
  • 全局变量:在点钱shell中任何地方使用

特殊变量

变量描述
$0获取当前执行的Shell脚本的文件名,如脚本中包含路径,则输出也包括路径
$n获取当前执行的Shell脚本的第n个参数值,如n>9,则需要使用用大括号,如${10},各参数间用空格进行分隔
$#获取当前执行的Shell脚本传入参数的总个数
$*获取当前执行的Shell所有传入参数,将这些参数视为一个整体,而不是多个个体
$@获取当前执行的Shell所有传入参数,将所有参数当作同一字符串中的多个独立的单词
$$获得当前shell的进程ID(PID)
$?最近一个命令的退出状态码,通过对256取模得到的余数作为状态码
$!最近一个后台命令的PID
$-显示Shell使用的当前选项,与set命令功能相同

关于$?得到的状态码,如果使用return,则返回return的结果,如果没有使用,将以最后一条命令运行结果,作为返回值,有以下几种

状态码描述
0命令成功结束
1通用未知错误
2误用Shell命令
126命令不可执行
127没找到命令
128无效退出参数
128+xLinux信号x的严重错误
130命令通过Ctrl+C控制码越界
255退出码越界

数组/Arrays

使用的是ksh shell在这里初始化数组的语法:

set -A array_name value1 value2 … valuen

使用的是bash shell中,这里是初始化数组的语法:

array_name=(value1 … valuen)

运算符

  • 使用 expr方式,运算符之前要有空格

    RESULT=`expr 2 + 3 `

  • 使用[]方式

    RESULT=$[(2+3)*4]

  • 使用$()方式

    RESULT=$(((2+3)*4))

  • 条件判断[]

    [ 条件 ] 中括号包围判断条件,且和条件中间有空格

算术运算符

假定变量 a 为 10,变量 b 为 20:

运算符说明举例
+加法`expr $a + $b` 结果为 30。
-减法`expr $a - $b` 结果为 -10。
*乘法`expr $a * $b` 结果为 200。
/除法`expr $b / $a` 结果为 2。
%取余`expr $b % $a` 结果为 0。
=赋值a=$b 将把变量 b 的值赋给 a。
==相等。用于比较两个数字,相同则返回 true。[ $a == $b ] 返回 false。
!=不相等。用于比较两个数字,不相同则返回 true。[ $a != $b ] 返回 true。

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。

关系运算符

假定变量 a 为 10,变量 b 为 20:

运算符说明举例
-eq检测两个数是否相等,相等返回 true。[ $a -eq $b ] 返回 false。
-ne检测两个数是否不相等,不相等返回 true。[ $a -ne $b ] 返回 true。
-gt检测左边的数是否大于右边的,如果是,则返回 true。[ $a -gt $b ] 返回 false。
-lt检测左边的数是否小于右边的,如果是,则返回 true。[ $a -lt $b ] 返回 true。
-ge检测左边的数是否大于等于右边的,如果是,则返回 true。[ $a -ge $b ] 返回 false。
-le检测左边的数是否小于等于右边的,如果是,则返回 true。[ $a -le $b ] 返回 true。
布尔运算符

假定变量 a 为 10,变量 b 为 20:

运算符说明举例
!非运算,表达式为 true 则返回 false,否则返回 true。[ ! false ] 返回 true。
-o或运算,有一个表达式为 true 则返回 true。[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a与运算,两个表达式都为 true 才返回 true。[ $a -lt 20 -a $b -gt 100 ] 返回 false。
逻辑运算符

假定变量 a 为 10,变量 b 为 20:

运算符说明举例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]] 返回 true
字符串运算符

变量 a 为 “abc”,变量 b 为 “efg”:

运算符说明举例
=检测两个字符串是否相等,相等返回 true。[ $a = $b ] 返回 false。
!=检测两个字符串是否相等,不相等返回 true。[ $a != $b ] 返回 true。
-z检测字符串长度是否为0,为0返回 true。[ -z $a ] 返回 false。
-n检测字符串长度是否为0,不为0返回 true。[ -n “$a” ] 返回 true。
$检测字符串是否为空,不为空返回 true。[ $a ] 返回 true。
文件测试运算符
操作符说明举例
-b file检测文件是否是块设备文件,如果是,则返回 true。[ -b $file ] 返回 false。
-c file检测文件是否是字符设备文件,如果是,则返回 true。[ -c $file ] 返回 false。
-d file检测文件是否是目录,如果是,则返回 true。[ -d $file ] 返回 false。
-f file检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。[ -f $file ] 返回 true。
-g file检测文件是否设置了 SGID 位,如果是,则返回 true。[ -g $file ] 返回 false。
-k file检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。[ -k $file ] 返回 false。
-p file检测文件是否是有名管道,如果是,则返回 true。[ -p $file ] 返回 false。
-u file检测文件是否设置了 SUID 位,如果是,则返回 true。[ -u $file ] 返回 false。
-r file检测文件是否可读,如果是,则返回 true。[ -r $file ] 返回 true。
-w file检测文件是否可写,如果是,则返回 true。[ -w $file ] 返回 true。
-x file检测文件是否可执行,如果是,则返回 true。[ -x $file ] 返回 true。
-s file检测文件是否为空(文件大小是否大于0),不为空返回 true。[ -s $file ] 返回 true。
-e file检测文件(包括目录)是否存在,如果是,则返回 true。[ -e $file ] 返回 true。

条件语句

if 语句语法格式:
if condition
then
    command1 
    command2
    ...
    commandN 
fi
if else 语法格式:
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi
if else-if else 语法格式:
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi
for循环一般格式为:
for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

写成一行

for var in item1 item2 ... itemN; do command1; command2… done;
while循环
while condition
do
    command
done
until 循环

和while循环相反,condition为false的时候,继续执行

case语句格式
case 条件 in
条件1)
    command1
    command2
    ...
    commandN
    ;;
条件2)
    command1
    command2
    ...
    commandN
    ;;
esac

shell 函数

格式,[]中的内容可以不写

[ function ] funname [()]

{

    action;

    [return int;]

}

如果参数返回不使用return,将以最后一条命令运行结果作为返回值

读取控制台输入内容

read [option] [variable]
option:
		-p:读取控制台值时提示符
		-t:等待时间

十秒内容输入内容,并使用NUM变量接收
read -t 10 -p "请输入内容" NUM


调用函数,不使用参数

#!/bin/bash

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"

调用函数,使用参数

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

使用$n来获取调用函数时传的第n个参数

Shell 输入/输出重定向

重定向命令列表

命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。

# # # # # # # # # # # # # # # # # # # # # # # # # #

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值