Linux定制篇之Shell入门

Shell脚本的执行方式

脚本格式要求

  • 脚本以#!/bin/bash开头
  • 脚本需要有可执行权限

Shell脚本中的注释方式:

单行注释使用#

多行注释如下
:<<!
注释内容
!

脚本的常用执行方式

  • 方式1(推荐使用)
    (1)、赋予helloworld.sh脚本x权限
    (2)、输入脚本的绝对路径或相对路径 执行脚本
  • 方式2:sh+脚本
    不用赋予脚本x权限,直接执行即可
Shell的变量

Shell变量简介:

  • Linux Shell中的变量分为:系统变量和用户自定义变量
  • 系统变量:HOME、USER等
  • 显示当前Shell中的所有变量:set

Shell变量的定义

  • 定义变量:变量名=值
  • 撤销变量:unset 变量名
  • 声明静态变量:readonly 变量名=值,注意:不能unset
  • export 可以把变量从一个sh脚本中导出为全局环境变量,供其他shell程序使用

Shell变量命名规则

  • 还是熟悉的配方,字母数字下划线,不能数字开头
  • 注意!等号两侧不能有空格
  • 变量名一般习惯大写

将命令的返回值赋值给变量

  • A=ls -la,将反引号内命令的结果返回给A
  • A= ( l s − l a ) , (ls -la), (lsla)()的作用相当于反引号
设置环境变量

环境变量其实就是上一小节的变量,只不过是全局变量

使用方法:

  • 在文件中定义(一般环境变量都在/etc/profile文件中):变量名=变量值
  • export 变量名
  • source 配置文件,刷新资源文件,使配置生效,也可以reboot或logout生效
  • echo $变量名,在终端或其他sh脚本中可以打印环境变量值
位置参数变量

位置参数变量类似于java main函数中的args,通过命令行传入参数。
例如: ./shell.sh 100 200,这是一个执行shell的命令,在shell脚本中就可以获取到位置参数100、200的信息。

使用方法:

  • $n:n为数字,$0代表命令本身,$n代表第n个参数,10以上的参数需要用花括号${10}
  • $*:表示命令行中的所有参数,把所有的参数看成一个整体,相当于只有一个元素
  • $@:表示命令行中的所有参数,但把每个参数区分对待,相当于所有参数构成了一个列表,参数是列表中的元素
  • $#:表示命令行中所有参数的个数
预定义变量

shell设计者实现定义好的变量,可以直接在shell脚本中使用。

使用方法:

  • $$:当前进程的PID
  • $!:后台运行的最后一个进程的PID
  • $?:最后一次执行的命令的返回状态,0表示上一个命令正确执行,非零表示不正确执行。
运算符

使用方法:

  • $((运算式))或$[运算式]
  • expr +,-,\*,/,%

示例:

  • 计算(2 + 3) * 4
RES1=$(((2+3)*4))  
echo $RES1  

echo $[(2+3)*4]

TEMP=`expr 2 + 3`  
RES3=`expr $TEMP \* 4`  
echo $RES3
  • 求出命令行的两个参数的和
vim shell.sh 100 200  
echo $[$1+$2]

注意!!!
使用第一种方式时运算符和两边的数字之间不能有空格,第二种方式即expr,运算符和两边的数字必须有空格。

条件判断

条件(condition)用法:
[ condition ] 注意condition前后有空格

示例:

  • 判断字符串"ok"是否等于"ok"
if [ "ok" = "ok" ]  
then
    echo "equal"
fi
  • 判断23是否大于等于22
if [ 23 -ge 22]
then
    echo "大于等于"
fi
  • 判断文件是否存在
if [ -e /root/shell/aaa.txt ]
then
    echo "exist"
fi
流程控制

1.流程控制之if
用法1:

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

用法2:

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

2.流程控制之case
用法:

case $变量名 in
val1)
程序段1  
;;
val2)
程序段2
;;
*)
程序段3
;;
esac

示例:

case $变量名 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

3.流程控制之for
用法1:

for 变量 in val1 val2 val3 ...
do
程序段
done

用法2:

for((初始值;循环控制条件;变量变化))
do
程序
done

示例:

  • 打印命令行输入的参数,此处可以看出 @ 和 @和 @*的区别
for i in "$*"
do
    echo $i
done

for j in "$@"
do
    echo $j
done
  • 从1累加到100
SUM=0
for((i=1;i<=100;i++))
do
    SUM=$[$SUM+$i]
done
echo $SUM

4.流程控制之while
用法:

while [ 条件判断式 ]
do
程序
done
  • 从命令行输入一个数n,统计1到n的累加值
SUM=0
i=0
while [ $i -le $1]
do
    SUM=$[$SUM+$i]
    i=$[$i+1]
done
echo $SUM
read读取控制台输入

使用方法:
read [选项] 参数

常用选项:
-p:指定读取值时的提示符
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待。

参数即指定读取值的变量名

示例:

  • 读取控制台输入一个num值
    read -p “请输入一个数num1=” NUM1
    echo “输入的值是num1=$NUM1”
  • 读取控制台输入一个num值,在10秒内输入
    read -t 10 -p “请输入一个数num2=” NUM2
    echo “输入的值是num2=$NUM2”
函数

shell编程与其他语言相同,有系统函数,也可以自定义函数。

两个简单的系统函数

  • basename:返回完整路径最后/的部分,常用于获取文件名
    basename [pathname] [suffix]
    basename [string] [suffix]
    如果添加了suffix选项,则返回值中会删掉suffix

  • dirname:返回完整路径最后/的前面部分,常用于返回路径部分

示例:

  • 返回/home/aaa/test.txt的“test.txt”部分
    basename /home/aaa/test.txt 返回test.txt
    basename /home/aaa/test.txt .txt 返回test

  • 返回/home/aaa/test.txt的/home/aaa部分
    dirname /home/aaa/test.txt

自定义函数

[function] funcname[()]
{
    Action;
    [return int;]
}

调用时直接用函数名:funcname

示例:

  • 计算输入两个参数的和
function getSum(){
    SUM=$[$n1+$n2]
    echo "和是$SUM"
}
read -p "输入n1" n1
read -p "输入n2" n2

# 调用
getSum $n1 $n2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值