linux--shell
shell的第一行一般都是#!开头指的是解释器,默认是
#!/bin/bash
#!/usr/bin/python
在路径下执行后缀.sh文件,需要加./,否者没有权限执行
解决方法1:在sh文件shebang中加入,#!/bin/bash
解决方法2:添加可执行权限给文件,chown +x 文件
解决办法3:直接执行解释器执行,/bin/bash xx.sh
bash
history命令
echo $HISTSIZE
bash_history#存放历史记录的位置
存储的数量,默认是3000
-c 清除历史
-r 恢复历史
!历史id ==>快速执行历史命令
!!==>执行上一次命令
\转义符号
bash内置命令
shell变量
shell是一种弱类型语言,无需声明变量类型,直接定义使用
变量类型,bash默认把所有的变量都认为是字符串
变量定义与赋值,变量与值之间不得有空格
注意:当你用bash/sh会开启一个子shell脚本,换个shell环境变量会发生改变,通过pstree可以查看。调用source或者点.符号,在当前shell环境加载加脚本,因此保留变量,变量会更改。
单引号变量不识别特殊符号
双引号变量能识别特殊符号
linux命令:
- echo $?#判断脚本是是否执行成功,成功返回的是0
- linux中反引中的命令执行结果会被保留下来 test=
ls
==>$()
- wc -l 统计行数, wc -L 统计行数,找出最长那一行,输出元素个数。
- ps -ef 只能看一个进程的命令,ps -ef –forest可以看到子进程的内容
环境变量设置
环境变量一般是指用export内置命令导出的变量,用于定义shell的运行环境、保证shell命令的正确执行。shell通过环境变量确定登录的用户名、PATH路径、文件系统等各种应用。
环境变量可以在命令行中临时创建,但是用户退出shell终端,变量既丢失,如果永久生效,需要修改环境变量配置文件
用户个人配置文件 /.bash_profile、/.bashrc 远程登录用户特有文件
全局配置文件 /etc/profile 、 /etc/bashrc,且系统建设最好创建在/etc/profile.d/,而非直接修改主文件,修改全局配置文件,影响所有登录系统的用户。
优先级是个人的bash_profile最高,全局变量其次。
检查系统环境变量的命令
set,输出当前环境所有变量,包括全局变量、局部变量
env,只显示全局变量
declare,输出所有的变量,如同set
export,显示和设置环境变量值
unset,变量名,删除变量或函数,撤销环境变量
readonly,只有shell结束,只读变量失效
环境变量文件加载顺序
特殊变量
[root@localhost test]# cat test01.sh
#! /bin/bash
echo '特殊变量 $0 $1 $2 实践'
echo '结果' $0 $1 $2
echo '#########################'
echo '特殊变量$# 获取参数总个数'
echo '结果:' $#
echo '#########################'
echo '特殊变量$* '
echo '结果:' $*
echo '#################'
echo '特殊变量$@实践 '
echo '结果:' $@
__________________________________________________________
[root@localhost test]# bash test01.sh sgz sgz 180 182 180
特殊变量 $0 $1 $2 实践 #$0获取文件名字 $1 $2...获取对应的参数
结果 test01.sh sgz sgz
#########################
特殊变量$# 获取参数总个数 # $#获取参数数量
结果: 5
#########################
特殊变量$* # $*获取参数
结果: sgz sgz 180 182 180
#################
特殊变量$@实践 # $@获取参数
结果: sgz sgz 180 182 180
[root@localhost test]#
$*和$@的区别
第一个是:”sgz 180 180″
第二个是:”sgz”,”180″,”180″
特殊状态变量
$?#判断脚本是是否执行成功,成功返回的是0
$$ 当前shell脚本的进程号
$!上一次后台进程的PID
$_在次之前执行的命令,最后一个参数
man bash 手册
脚本返回值
shell子串的花式用法(字符串的截取)
截取
从头截取到最近,从头截取到最尾
从后往前删除
利用反引号替换
for语句的基本语法
for number in {1...100}
do
echo $number
done
for num in {1..100};do echo $num ; done #写在一行的语法
seq生成序列的命令
seq 10 #默认是以换行作为分隔符
seq - s ":" 10 #修改默认分隔符
使用time计算出时间
time for n in {1..10000};do char=’seq – s “sgzz” 100′;echo ${#char} &>/opt/t1.txt;done
real 实际运行的时间
user 用户态执行的时间
sys 内核态执行的时间
time for n in {1..10000};do char=’seq – s “sgzz” 100′;echo ${char}|wc -L &>/opt/t1.txt;done
wc -L 执行时间需要40+s
[root@iZwz9257qzx65cidlm6w9eZ opt]# time for n in {1..10000};do char=’seq – s “sgzz” 100′;expr length ${char} &>/opt/t1.txt;done
expr length 相比管道符计算快
| awk也是相对较慢40+s
shell编程尽量使用内置操作和函数。效率相对比较高
变量的扩展语法
:-
:+
:?
:=
学习子的意义
创建进程列表(创建shell)
shell的进程列表理念,需要使用()小括号,如下执行方式就称为 进程列表(加上小括号就是开启子shell运行命令)
(cd~;pwd;ls;cd /tmp/;pwd;ls)
检测是否开启了子shell命令
#该变量的特点,如果是0就是在当前的shell环境中执行的,否则就是开辟子shell去运行的
BASH_SUBSHELL
#检测
cd ~;pwd;ls;cd /tmp/;pwd;ls;echo $BASH_SUBSHELL
#结果输出0 加上小括号输出1,几个小括号输出几
内置命令、外置命令
内置命令:在系统启动时就加载入内存,常驻内存,执行效率更高,但是占用资源。eg:cd、ls
外置命令:系统需要从硬盘中读取程序文件,再读入内存加载
type命令可以验证是内置还是外置
type ps
外置
内置
内置命令不会产生子进程去执行,内置命令和shell是为一体的,是shell一部分,不需要去单独读取某个文件,系统启动后,就会执行在内存了
#查看所有内置shell命令
compgen -b
好文:https://blog.csdn.net/w918589859/article/details/108752592?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166079933116782388091250%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=166079933116782388091250&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-108752592-null-null.142v41pc_rank_34_queryrelevant25,185v2control&utm_term=shell%E6%95%99%E7%A8%8B&spm=1018.2226.3001.4187