初试入门
入门 helloword.sh 程序
使用编辑器vim
创建并添加语句
vim helloworld.sh
#! /bin/bash
echo 'helloworld'
#! /bin/bash
是指此脚本使用/bin/bash来解释执行。
echo
输出语句
chmod ug+x helloworld.sh # 修改文件执行权限
./helloworld.sh # 执行脚本
执行结果
运行shell脚本的四种方式
-
绝对路径
权限:
1、当前用户对沿途的文件卖都有x
权限
2、当的用户对目标文件应该有rx
权限用法:绝对路径即可
-
相对路径
权限:- 当前用户对沿途的文件夹都有
x
权限 - 当前用户对目标文件应该有
rx
权限
用法:必须加上
./
作为前缀 - 当前用户对沿途的文件夹都有
-
加上解释器作为前缀;
权限:- 当前用户对沿途的文件夹都有
x
权限 - 当前用户对目标文件应该有
r
权限
用法:
bash 文件路径〔绝对路径、相对路径)
sh 文件路径〔绝对路径、相对路径)
- 当前用户对沿途的文件夹都有
-
用source命令执行或者在路径前加.空格作为前缀
权限:- 当前用户对沿途的文件夹都有
x
权限 - 当前用户对目标文件应该有
r
权限
用法:
source 文件路径 (绝对路径、相对路径)
. 文件珞径 (绝对路径、相对路径)
- 当前用户对沿途的文件夹都有
方式1、2、3都是开启一个子bash进程,然后在子进程里运行的shell程序
方式4是直接在当前bash进程里运行的shell程序
进程之间变量不能相互调用,线程是独立的
注释
# 前面加 # 这就是注释
echo 'helloworld' # 也可以在语句后面加注释
# name=123 #也可以注释掉语句
调试功能
-x
就是调试功能
sh -x /a/b/1.sh
-vx
一箩筐显示功能,+ 号是可调式代码
sh -x /a/b/1.sh
在.sh
文件里 使用 set -x
、set +x
部分调试代码
#XXXX
#XXXX
#XXXX
set -x
echo 111
set +x
echo 222
echo 3333
sh -x /a/b/1.sh
shell编写规范与建议
一、脚本编写规范
- 脚本存放目录需要统一
- shell脚本的结尾以.sh
- 脚本开头要有解释器如#!/bin/bash 或者#!/usr/bin/env bash
- 脚本开头注意加时间、作者、联系邮箱、脚本作用等信息
# Author egon 2020-8-30version 1 des: xXXXX
- 关键代码应该用#号加上注释
二、代码编写好习惯
- 成对的符号尽量一次性写出来,防止遗漏
例如大括号{},中括号[ ],小括号(),单引号'',双引号"",反引号``等
- 括号的保留空格习惯
中括号 [ ] 两端需要留有空格,不然会报错。书写时即可留出空格然后书写内容。 如果不知道大括号 { } ,中括号 [ ] ,小括号 ( ) ,到底哪种括号需要两端留空格,可以在书写这些括号的时候两端都保留空格来进行书写,这样可以有效避免因空格导致的各种错误。
- 流程控制语句一次性书写完再添加内容
例1:if语句格式一次书写完成 if 条件内容 then 条件成立后执行的代码 fi
变量
变量
一、变量介绍
什么是变量?
变:事物的状态是会发生变化的
量:记录事物的状态
变量是一种存取内存的机制
为何要用变量?
是为了让计算机具备人的某项技能
二、变量的使用
- 先定义、后引用
先定义age=18
后引用echo $age
- 删除变量
删除变量unset age
补充:字符连接
money=1000
echo ${money}RMB
三、变量的三大组成部分
变量名 赋值号
- 变量名的命名规范
- 前提:变量名的命名必须见名知意
- 规范:
- 变量名是由字母数字下划线组成
- 不能以数字开头
- 不能使用shell的关键字
- 不要使用中文的变量名
- 变量值的三种来源三预定变量
- 直接赋值
ip="10.0.0.11" age=18 now_date1=`date "+%F"` now_date2=$(date "+%F")
- 从脚本的参数获取,即从命令获取
创建.sh脚本$0 是本身 $1 是第一个参数 $2 是第二个参数 ... ${10} 10以上就要用{}括起来
nginx.sh
运行#! /bin/bash if [ $1 = "start" ];then echo "nginx is starting..." elif [ $1 = "stop" ];then echo "nginx is stopping" elif [ $1 = "restart" ];then echo "nginx is restartting" else echo "Usage: ./nginx.sh start:stop:restart" fi
chmod +x nginx.sh # 设置权限 ./nginx.sh stop # stop 是传入的变量
- 与用户交互来获取变量值,即通过键盘输入来获取
read -p "请输入您的账号:" name
登录案例
运行db_name="egon" db_pwd="123" read -p "请输入您的账号:" inp_name read -p "请输入您的密码:" inp_pwd if [ $inp_name = $db_name ] && [ $inp_pwd = $db_pwd ]:then echo "登录成功" else echo "登录失败" fi
chmod +x login.sh ./login.sh 请输入您的账号:egon 请输入您的密码:123 登录成功
- 直接赋值
与用户交互
接收用户输入:read命令
把程序的处理结果反馈给用户:
echo命令格式化输出
user="egon"
age=18
echo "my name is $user my age is $age"
printf命令的格式化输出
printf "my name is %s, my age is %s\n" "egon" 18 #直接传入
x="egon"
y=18
printf "my name is %s, my age is %s\n" $x $y #变量传入
%s 字符串、%d整型、%f浮点数
%f浮点数 " %.2f "显示后两位小数 " %8.2f "显示整数8位,小数2位
预定义变量
$* # 获取所有的位置参数
$@ # 获取所有的位置参数
$# # 获取所有的位置参数个数
$$ # 获取当前shell进程的pid
$? # 获取上一条命令运行状态,0代表成功 非0代表失败
四、常量
常量:不变的量
readonly m=111 # 使用常量关键字
AGE=18 # 或者使用大写变量名来提示自己这是常量
基本数据类型与值操作
二、基本数据类型
整型:年龄、个数、号码
age=10
level=3
浮点型:薪资、身高、体重
salary=3.3
height=1.81
字符串类型:名字、国籍、名人名言、ip地址等描述性质的内容
msg="hello"
msg='hello' # 硬引用,包含的字符均无特殊意义
sheil是一门角解释型的、弱类型
x=1
y="100"
expr $x + $y #结果 101 ,expr 运算
数组类型:
- 普通数组
# 直接赋值 hobbies=("抽烟" "酒" "烫头") echo ${hobbies[0]} # 结果:抽烟 echo ${hobbies[1]} # 结果:酒 echo ${hobbies[2]} # 结果:烫头 # 先创建后赋值 declare -a array1 array1[0]=12 array1[1]=34 array1[2]=56 echo ${array1[0]} # 结果:12 echo ${array1[1]} # 结果:34 echo ${array1[2]} # 结果:56 # 指定下标对应为什么值 array2=([2]=3.3 [1]=1.1 [3]=4.4) echo ${array2