shell编程基础1
1,查看系统的shell支持情况
[root@oss2 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
2,查看系统默认的shell
~]# set |grep SHELL
SHELL=/bin/bash
[root@oss2 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
3,给vi设置别名vim
~]# echo "alias vi='vim'" >>/etc/profile
~]# tail -1 /etc/profile
alias vi='vim'
~]# source /etc/profile
4,脚本开头第1行
#!/bin/bash
或者
#!/bin/sh
例子:
~]# cat test.sh
#!/bin/bash
echo "hello,xiaoming"
查看系统信息
~]# uname -a
Linux oss2 3.10.0-957.el7_lustre.x86_64 #1 SMP Fri Dec 21 21:49:33 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
检测系统漏洞
~]# env x='() { :;}; echo be careful' bash -c "echo this is a test"
this is a test
如果输出be careful,则需要升级
~]# yum update bash
~]# rpm -qa bash
脚本的注释
以#开头,都是注释(除脚本的第一行)
5,shell脚本的执行
它会先找系统环境变量ENV,该变量指定了环境文件,
其加载顺序通常是/etc/profile --- ~/.bash_profile --- ~/.bashrc --- /etc/bashrc
加载完上述环境变量文件后,shell就开始执行shell脚本中的内容
通常有几种方式
(1)bash script-name 或者 sh script-name
(2)加x权限chmod +x script-name 后,执行 ./script-name
(3)source script-name 或者 . script-name
符号
对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格;
需要强引用的(指的是所见即所得的字符串引用),则用单引号(''),
如果是命令的引用,则用反引号(``).
脚本中的单引号、双引号及反引号必须为英文状态下的符号。
6,变量
变量是什么?
就是用一个固定的字符串(左边:变量名),赋值(=),(右边:变量)字符、数字、变量、路径、字符串等内容
变量名=变量内容 ---等号左右边不能有空格
]#a="xiaoming"
]#echo $a
7,变量的特性
变量可分为两类: 环境变量(全局变量)和普通变量(局部变量)
环境变量:一般是指export内置命令导出的变量,用于定义shell的运行环境,保证shell命令正确运行。
shell通过环境变量来确定登陆用户名,命令路径,终端类型,登陆目录等,
按照系统规范,所有环境变量的名字均采用大写形式
在仓库设置的变量时,有3个命令可以显示变量的值:set、env和declare
set命令输出所有的变量,包括全局变量和局部变量;
env命令只显示全局变量;
declare命令输出所有的变量,函数,整数和已经导出的变量。
set -o 命令显示bash shell所有参数配置信息。
8,自定义环境变量
export命令和declare -x 格式如下(注:不需要在变量名前面加$):
设置环境变量的3种方法:
(1)export 变量名=value
(2)变量名=value;export 变量名
(3)declare -x 变量名=value
例子:
~]# export NAME=xiaoming
~]# declare -x NAME=oldboy
~]# NAME=xiaoming;export NAME
(unset NAME 删除环境变量)
9,环境变量永久生效的常用设置文件:
(1)用户的环境变量设置
比较常见在用户家目录下的.bashrc和.bash_profile
推荐在/root/.bashrc 文件中优先设置
(2)全局环境变量的配置
常见的全局环境变量的配置文件如下:
/etc/profile
/etc/bashrc
/etc/profile.dl/
推荐在/etc/bashrc 文件中优先设置
登陆后初始化或显示加载内容,则把脚本文件放在/etc/profile.d/下即可(无需加执行权限)
(1)在/etc/motd里增加提升的字符串(只能是字符串,不能是命令等)
~]# cat /etc/motd
welcome to xiaoming
(2)在/etc/profile.d/目录下增加如下脚本。
~]# cat /etc/profile.d/xiaoming.sh
echo "hello,xiaoming, are you OK?"
10,显示与取消环境变量
(1)通过echo或printf命令打印环境变量(printf不常用)
~]# echo $USER
~]# printf $USER
(2)用env(printenv)或set显示默认的环境变量
(3)用unset 消除本地变量和环境变量
~]#unset NAME
11,普通变量
普通变量定义:
为普通变量的定义赋值,一般有3种写法:
(1)变量名=value #赋值时不加引号----不加引号时,值里有变量的会被解析后再输出;单纯数字的内容可以不加引号
(2)变量名='value' #赋值时加单引号---单引号时,有什么就输出什么
(3)变量名="value" #赋值时加双引号---双引号时,值里的变量及命令会经过解析后再输出内容---(推荐)
变量名一般是由字母、数字、下划线组成的,可以以字母或下划线开头。例如xiaoming,xiao_ming,xiaoming123
$变量名表示输出变量,可以用$a和#{a}两种用法。
~]# m=xiaoming
~]# a=xiaoming-$m
~]# echo $a
xiaoming-xiaoming
~]# a=xiaoming
~]# b=xiaoming$a
~]# echo ${b}
xiaomingxiaoming
把一个命令的结果作为变量的内容赋值的方法:
(1)变量名=`ls` #把命令用反引号引起来
(2)变量名=$(ls) #把命令用$()括起来---(推荐)
例子
~]# CMD=`ls` ;echo $CMD
~]# CMD=$(ls) ;echo $CMD
~]# echo $(date +%F)-xiaoming.txt
2025-05-1-xiaoming.txt
~]# echo `date +%F`-xiaoming.txt
2025-05-1-xiaoming.txt
使用awk调用变量的关系,看图
~]# TS1="xiaoming"
[root@test01 ~]# echo "$TS1"
xiaoming
[root@test01 ~]# echo "$TS1"|awk '{print $0}'
xiaoming
grep过滤字符串时给过滤的内容加引号
~]# TS1="xiaoming"
~]# cat ts1.log
xiaoming
zhangsan
~]# grep "$TS1" ts1.log
xiaoming
通过sed指定变量关键字过滤
~]# TS1="xiaoming"
~]# cat ts1.log
xiaoming
zhangsan
~]# sed -n /"$TS1"/p ts1.log
xiaoming
12,shell中的特殊位置参数变量
$0 获取shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径
$n 获取当前执行shell脚本的第n个参数值(当位置参数大于9的时候,需要用大括号将数字括起来,${10})
$# 获取脚本的参数的总个数
$* 获取所有传参的参数值。$#表示所有参数为单个字符串组成,相当于"$1 $2 $3"
$@ 获取所有传参的参数值。$@表示不同独立字符串,相当于"$1" "$2" "$3"
$? 获取返回值。上一个指令的执行状态返回值(0为成功,非零为失败)-----最常用
$$ 获取当前shell脚本进程号PID---不常用
$! 获取上一个在后台工作的进程的进程号PID---不常用
$_ 获取在此之前执行的命令或脚本的最后一个参数---不常用
例子
~]# echo "echo" \${1..9} >m.sh
~]# cat m.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
~]# echo {a..i}
a b c d e f g h i
~]# sh m.sh {a..i}
a b c d e f g h i
~]# cat m.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo $#
~]# sh m.sh {a..i}
a b c d e f g h i
9
条件表达式判断语句
~]# cat test2.sh
#!/bin/bash
[ $# -ne 2 ] && {
echo "You must be input two args"
exit 1
}
echo "xiaoming"
测试$*与$@的区别:
~]# cat m.sh
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo $#
echo -e "test \$*:"
for i in "$*";do echo $i;done
echo -e "test \$@:"
for i in "$@";do echo $i;done
"$?"返回值的用法:
(1)判断命令、脚本、函数等程序是否执行成功
(2)若在脚本中调用执行"exit 数字",则会返回这个数字给"$?"变量
(3)如果是在函数里,则通过"return 数字"把这个数字以函数返回值的形式传给"$?"
13, shell内置变量命令
echo
echo的参数说明
-n 不换行输出内容
-e 解析转义字符
转义字符:
\n 换行
\r 回车
\t 制表符
\b 退格符
\v 纵向制表符
read
功能:从标准输入读取字符串等信息,传给shell程序内部定义的变量
命令格式:read 变量名表
14,shell变量子串
${parameter} #返回变量$parameter的内容
${#parameter} #返回变量$parameter内容的长度(按字符),也适用于特殊变量
~]# a=xiaoming
~]# echo ${#a}
8
~]# echo $a|wc -L
~]# expr length "$a"
~]# echo "$a"|awk '{print length($0)}'