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命令:

  1. echo $?#判断脚本是是否执行成功,成功返回的是0
  2. linux中反引中的命令执行结果会被保留下来 test=ls ==>$()
  3. wc -l 统计行数, wc -L 统计行数,找出最长那一行,输出元素个数。
  4. 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

版权声明:本文为starSgz原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/starSgz/p/16488087.html