Shell 语言基础笔记

本文介绍了shell编程的基础知识,包括查看系统shell支持、设置别名、脚本开头的shebang、环境变量的使用、自定义环境变量、脚本执行方式、变量类型和操作、以及条件表达式和内置命令如echo和read的应用。
摘要由CSDN通过智能技术生成

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)}'

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值